今回はスプライトの表示や、スプライトを動かすことの基本を
説明します。
MSX実機がない方はエミュをどうぞ!
今ならブラウザで動くエミュがあります。
webMSXへのリンクはこちら。
webMSXの使い方の説明はこちらへどうぞ。
WebMSXの使い方を調べてみました。 - ニャオニャオ21世紀
- MSXのスプライトとは
- スプライトの定義 SPRITE$
- スプライトの表示 PUT SPRITE
- READ / DATA データの読み込み
- CHR$ キャラクターダラー関数
- VAL 数字にします
- LEFT$ 左から文字をいくつか抜き出す
- RIGHT$ 右から文字をいくつか抜き出す
- 2進数と16進数は、どうやって区別するのか?
- スプライトの移動は?
- まとめ
その他、MSX BASICの基本のページについての
目次はこちら
MSXのスプライトとは
スプライトって当時はすごい機能でしたよね!
キャラクターが自由自在に、背景に影響されることなく動かすことが
できるわけですから!
御三家 ( NEC、シャープ、富士通 )のパソコン、88とかX1とかFM7とかには
ない機能でした。
解像度で劣るMSXで、他のお高いパソコンに勝てる機能でしたねー^^
スプライトのおかげでMSXにはアクションゲーム、シューティングが
結構発売されました。
魔城伝説1とかガリウスとか、グラディウス2、スーパーレイドック、
妖怪屋敷もありましたねぇ(^o^)
こういったゲームもスプライトがなければ出来なかったと思います。
ファミコンのスプライト機能には負けていましたけどね (~~)
MSXのスプライトは1枚につき1色しか出せませんでした。
そのためスプライトを2枚重ねして、2色のキャラクターを表示していました。
思い出してきたんじゃないでしょうか^^
横には4枚までが表示でき、全体では32枚表示できたんだったかな。
(横は4枚までだったので、それ以上並んだ時は交互に表示していました。
そのためチラついて見えました)
このあたりの制限はきれいに忘れていたりしているかもしれません(#^.^#)
あ〜そうだったなぁと思い出して頂けたら。
MSX BASICでも簡単にスプライトを表示できました。
スプライトを表示して遊んだ方も多いのではないでしょうか?
僕のBASIC歴は、スプライトで表示して、カーソルキーまたはジョイスティックで
動かして終わりましたw
2枚重ねもアニメーションもさせていなかったですね〜。
そこは小学生だったので;
そのくせ、ドット絵を紙に描いたりしていましたw
今回は、スプライトの定義、表示をやりたいと思います。
スプライトの移動、キャラ歩行のアニメーション、2枚重ねは、
こちらで少し書いています。
よろしければご覧ください。
WebMSXでMSX BASIC の自作ゲーム作成!第一弾。キャラを動かすプログラムを書きました(URLクリックで実行できます) - ニャオニャオ21世紀
前回はPRINT、GOTO、IF~THEN、FOR~NEXT、SCREENについて書いています。
あとMSX BASICの基本的な書き方、操作方法など。
こちらを先にご覧くださるとよくわかると思います^^
MSX BASICの基本を思い出しましょう(その1)! PRINTやIFやGOTOを使ったくらいでやめてしまった方へ。初心者歓迎。 - ニャオニャオ21世紀
スプライト定義とスプライトの表示のプログラム
(8ドットx 8ドットの場合)
10 SCREEN 1,0
20 FOR I=0 TO 7
30 READ DT$
40 SP$=SP$+CHR$(VAL("&B"+DT$))
50 NEXT
60 SPRITE$(0) =SP$
70 PUT SPRITE0,(124,92),15,0
80 END
100 DATA00000000
110 DATA00011000
120 DATA00111100
130 DATA01111110
140 DATA11111111
150 DATA01111110
160 DATA00111100
170 DATA00011000
これだけで思い出した人もいるのかなぁ〜^^
このサンプルコードをそのまま使ったりするだけでも
いいと思います^^
基本は、
SPRITE$でスプライトを定義して、
PUT SPRITEで表示するだけです。
(16ドットx 16ドットの場合)
10 SCREEN 1,2
20 FOR I=0 TO 15
30 READ DT$
40 L$=L$+CHR$(VAL("&B"+LEFT$(DT$,8)))
50 R$=R$+CHR$(VAL("&B"+RIGHT$(DT$,8)))
60 NEXT
70 SPRITE$(0) =L$+R$
80 PUT SPRITE 0,(124,92),15,0
90 END
100 DATA0000000110000000
110 DATA0000001111000000
120 DATA0000011111100000
130 DATA0000111111110000
140 DATA0001111111111000
150 DATA0011111111111100
160 DATA0111111111111110
170 DATA1111111111111111
180 DATA0000011111100000
190 DATA0000011111100000
200 DATA0000011111100000
210 DATA0000011111100000
220 DATA0000011111100000
230 DATA0000011111100000
240 DATA0000011111100000
250 DATA0000011111100000
8x8ドットと16x6ドットでは、
プログラムが少し違います。
スプライトの定義 SPRITE$
SPRITE$
機能 : スプライトを定義、参照する
書式 : SPRITE$ ( スプライトパターン番号 )
例 DATA文でスプライトの形を、A$ (B$とかSP$とか、文字型の変数)
に読み込んでおいて、
SPRITE$(0) = A$
とやります。
初めての方は、 この説明ではさっぱりわからないかもしれないですね;
最後にソースコードをみればわかると思うので、もう少しお付き合いください。
この命令で、スプライトパターン番号にスプライトの形を
定義します。
上の例だと、スプライト0番に、A$に入っているスプライトの形を定義しています。
下の方でもう少し詳しく説明します。
スプライトサイズは、8ドットx8ドット、16ドットx16ドットとありました。
スプライト番号は、8x8ドットの時が、0~255,
16x16ドットの時が、0~63
おーたくさんスプライトの形の定義ができるんですねー。
これは今回はじめてしりました^^
8x8ドットサイズの時
まずSCREENで画面モードを設定します。
今回は、SCREEN 1,0にしました。
2つ目のパラメータが0です。
SCREENについてはこちらへ。
MSX BASICの基本を思い出しましょう(その1)! PRINTやIFやGOTOを使ったくらいでやめてしまった方へ。初心者歓迎。 - ニャオニャオ21世紀
スプライトパターンは8文字で定義します。
8文字?
このあたりは当時は全く知らなかったですね〜。
ただサンプルをそのまま書いていただけで^^
まぁ仕組みを知らなくても、こうやって書くんだとプログラムを
コピぺするだけでもいいと思います。
でも大人になると詳しく知りたくなりますがw
それで、8文字って何?と思うと思います。
よく雑誌などでみていたのは、
DATA 00000000
DATA 00011000
DATA 00111100
DATA 01111110
DATA 11111111
DATA 01111110
DATA 00111100
DATA 00011000
っていう0と1で形を作るというものだと思います。
これと8文字にどんな関係が?
と思うと思います。
まず、
DATA 00111100
こういう00111100って数字を、そのキャラクターコードに対応する文字にします。
2進数 00111100 は、10進数で60なので
CHR$(60)
とすると、
<
になります。
こんな感じになります。
=の後に、なにも書いていないところも目に見えない文字がはいっております^^;
MSX BASICをどこまで学んでいたかによって、
理解できるところが変わりますが、
私が小学生のころは、上に書いたところがは全くわかりませんでした;
人によっては、思い出したよ!って方もいるかと思います。
初めての方のために、
001111100のような数字を、
キャラクターコード(数字)に対応する文字に変えるというところを
易しく説明します。
分かる方はとばしてください。
DATA文の、
00111100って数字の羅列を、2進数として扱います。
まぁ当時は2進数なんて知らなかったですけど^^
2進数についてはこちらへ。
MSX マシン語入門(Z80 アセンブラ・機械語) 勉強レポート 第2回 2進数 - ニャオニャオ21世紀
2進数のしくみを知らなくても、とりあえずはプログラムはできます。
ご安心ください(^^)
(マシン語とか、BASICでも高度なことをやろうとすると
2進数の仕組みは知っていないとだめですが。暇なときにでもやってください^^)
一つの数字を、
2進数で表したり、10進数で表したり、16進数で表したりできるということを
知っていればOKです。
ちなみに、10進数が、日常で普通に使っている数字です。
この数字の変換は、今はツールを使えばいいでしょう。
こちらのサイト様で出来ます。
リンクを貼っておきます。
ちなみに先ほどの、00111100をツールで変換してみると、
2進数 ->00111100
10進数 -> 60
16進数 -> 3C
と表示されます。
先ほどのDATAの中身を10進数で表現すると、
(2進数) -> (10進数)
00000000 -> 0
00011000 -> 24
00111100 -> 60
01111110 -> 126
11111111 -> 255
01111110 -> 126
00111100 -> 24
00011000 -> 24
スプライトの形を表した0と1の数字(2進数)が、普通の10進数になりました。
これをキャラクターコードを使って文字にします。
こんな感じな命令です。
CHR$(65)
じつは文字には、すべて番号(キャラクターコード)がふってあります。
Aは、65番
Bは、66番
Cは、67番
Dは、68番
というように。
CHR$(数字)は、キャラクターコードに対応した文字を表しています。
そのため、
PRINT CHR$(65)
とプログラムを書けば、Aが表示されるのです。
ここから話を戻します。
> 8x8サイズの時
> スプライトパターンは8文字で定義します。
とありました。
(READ DT$でDATA文からスプライトの形をあらかじめ読み込みます。
別にDT$じゃなくてもA$でもB$でもお好きな変数でどうぞ^^)
SPRITE$(0)=DT$
でスプライト0番を定義しますが、
DATA文の中身の、
00011000などをCHR$で文字にしておかないといけません。
定義するというのは、
SPRITE$(0) = " <~ ⬛️~< "
こんなようなことになります。
これが8文字の正体です!!!
スプライトの横1ラインが1文字に対応しています。
それで8x8ドットの時は、8文字になります。
(MSX BASICでは、文字と数字があるのですが、
CHR$には数字をセットしてやらないといけません。
DATA文は、文字型で読み込んでいるので一度、数字型に変えてから
CHR$(数字)にセットします。
このあたりがややこしい;数字型にしたり、文字型にしたり。
今のPCで、C言語とかだったら、intやcharと宣言するんですけどねぇ。
イヤ、今は、型がないのが主流なのかな。
いつの時代も、文字型、数字型の問題はついて回りますw)
MSX FANの1画面プログラムで、よくこんな感じで、
スプライトの定義がされていましたね〜。
あれはなにをしているのだろうと思っていたのですが、
こういうことだったのです!
8x8ドットSPRITE$のまとめ
MSX BASICでは、スプライトは8文字で定義されます。
(他の方法もあります。それは別のページで)
下はスプライトを定義するだけのプログラムです。
(このプログラムはスプライトの表示はしておりません。
PUT SPRITE命令のところで、表示も含めた例を書きます)
(READ~DATA文、CHR$文、VAL文、&Bの説明も下でします。)
10 SCREEN 1,0
20 FOR I=0 TO 7
30 READ DT$
40 SP$=SP$+CHR$(VAL("&B"+DT$) )
50 NEXT
60 SPRITE$(0) =SP$
70 END
100 DATA00000000
110 DATA00011000
120 DATA00111100
130 DATA01111110
140 DATA11111111
150 DATA01111110
160 DATA00111100
170 DATA00011000
解説
20行 FOR ~ NEXTで、20行から50行を8回繰り返します。
30行 READ文でDATAを1行づつ読み込みます。
CHR$で、DATA文1行づつを文字にし、
SP$にいれていきます。
SP$ = SP$ + CHR$()は、
FOR文で1ループ目は、SP$に、1文字入り、
FOR文で2ループ目で、SP$が、2文字になり、
~
FOR文で8ループ目で、SP$は、8文字になります。
<追記>
40行 SP$ = SP$ + CHR$(VAL("&B"+DT$) )
これは少しややこしいかもしれないですねぇ。
CHR$(VAL("&B"+DT$) )は、
3つに分けることができます。
CHR$( )と、
VAL( )と、
"&B"+DT$です。
1つずつ行きます。
CHR$( )は文字を表します。これはわかると思います。
CHR$(65)は、キャラクターコード65は、Aを表しているとか、
決められています。
CHR$( )のカッコの中は数字になります。
そこでVAL( )です。
VAL( 2 )だと、文字である2を数字の2に変えます。
VAL( "&B00000010")というのは、
&B00000010という文字列をVALで数字に変えてやるということです。
数字の2になります。
VAL("&B00000010")とやってやれば、
00000010という文字の集まりが、
普通の10進数の数字になる!
とでも覚えておけばOKでしょう。
一番使うのが、DATA文に入った
01010101といったデータを数字にしてやることですね!
しかし、かなりトリッキーなことをやりますよね^^;
2進数、10進数、16進数変換WEBツールサイト
https://hogehoge.tk/tool/number.html
最後に、"&B" + DT$ですね。
&Bというのは2進数のことです。
(00011000という数の羅列があったとして、
これは2進数なのか、10進数なのか、16進数なのかわからないですよね?)
(2進数) &B00011000 ー>(10進数だと) 24 ー>(16進数だと) &H18
このように数字の頭に記号を付けてやります。
(10進数はなにもつけない)
普通に 00011000とあったら、10進数なので1万1千という数になります。
上のプログラムの考え方は、
まずDATAが00011000など8桁の2進数である。
⇓
スプライトに定義するには文字(アスキー、AとかBとか)に
変えなければいけない。
⇓
CHR$(&B0011000)でいいのかな?
⇓
ここで要注意!
DATAの内容はDT$という文字列変数に入れています。
ということは00011000は文字。
それを数字に変えてやります。(CHR$( )の中身は数字しかダメなので)
VAL("&B00011000")
⇓
それで、文字(アスキー)にするのは、
CHR$(VAL(”&B00011000") )
結果として、
CHR$(VAL("&B"+DT$) )
で、1文字( CHR$(アスキーコード) )を得ることができます。
お疲れ様です^^
60行 SPRITE$(0)でスプライト0番目にスプライトの形(SP$)を定義します。
70行 終わり
100行以下〜 スプライトの形のデータ
16x16ドットサイズのとき
(8x8ドットサイズの箇所を最初に読んでください^^)
まず、SCREEN 1,2の
2つ目のパラメータが2です。
SCREENについてはこちらへ。
MSX BASICの基本を思い出しましょう(その1)! PRINTやIFやGOTOを使ったくらいでやめてしまった方へ。初心者歓迎。 - ニャオニャオ21世紀
スプライトパターンは32文字で定義します。
8x8ドットの時は8文字だったので、4倍になっています。
16x16ドットのスプライトの定義は、
8x8のパターンを表す文字列を左上、左下、右上、右下の
順に並べた文字列になります。
つまり、
100 DATA0000000110000000
110 DATA0000001111000000
120 DATA0000011111100000
130 DATA0000111111110000
140 DATA0001111111111000
150 DATA0011111111111100
160 DATA0111111111111110
170 DATA1111111111111111
180 DATA0000011111100000
190 DATA0000011111100000
200 DATA0000011111100000
210 DATA0000011111100000
220 DATA0000011111100000
230 DATA0000011111100000
240 DATA0000011111100000
250 DATA0000011111100000
8x8ドットの時と全く同じように、赤いところ(8x8パターン)を
CHR$で文字にします。(8文字になります)
次に、
100 DATA0000000110000000
110 DATA0000001111000000
120 DATA0000011111100000
130 DATA0000111111110000
140 DATA0001111111111000
150 DATA0011111111111100
160 DATA0111111111111110
170 DATA1111111111111111
180 DATA0000011111100000
190 DATA0000011111100000
200 DATA0000011111100000
210 DATA0000011111100000
220 DATA0000011111100000
230 DATA0000011111100000
240 DATA0000011111100000
250 DATA0000011111100000
左下である水色のところ( 8x8パターン )を。
そして、
100 DATA0000000110000000
110 DATA0000001111000000
120 DATA0000011111100000
130 DATA0000111111110000
140 DATA0001111111111000
150 DATA0011111111111100
160 DATA0111111111111110
170 DATA1111111111111111
180 DATA0000011111100000
190 DATA0000011111100000
200 DATA0000011111100000
210 DATA0000011111100000
220 DATA0000011111100000
230 DATA0000011111100000
240 DATA0000011111100000
250 DATA0000011111100000
右上の黄色のところ(8x8パターン)を。
最後に、
100 DATA0000000110000000
110 DATA0000001111000000
120 DATA0000011111100000
130 DATA0000111111110000
140 DATA0001111111111000
150 DATA0011111111111100
160 DATA0111111111111110
170 DATA1111111111111111
180 DATA0000011111100000
190 DATA0000011111100000
200 DATA0000011111100000
210 DATA0000011111100000
220 DATA0000011111100000
230 DATA0000011111100000
240 DATA0000011111100000
250 DATA0000011111100000
右下である緑のところ( 8x8パターン )を。
SPRITE$(0) = 赤8文字青8文字黄色8文字緑8文字
の順で文字を並べて登録します。
SPRITE$(0) = (左上) (左下)(右上)(右下)
ですね。
普通に上から登録できるといいのに(~~;
16x16ドットのスプライトを定義するプログラム
(表示はしません)
10 SCREEN 1,2
20 FOR I=0 TO 15
30 READ DT$
40 L$=L$+CHR$(VAL("&B"+LEFT$(DT$,8)))
50 R$=R$+CHR$(VAL("&B"+RIGHT$(DT$,8)))
60 NEXT
70 SPRITE$(0) =L$+R$
80 END
100 DATA0000000110000000
110 DATA0000001111000000
120 DATA0000011111100000
130 DATA0000111111110000
140 DATA0001111111111000
150 DATA0011111111111100
160 DATA0111111111111110
170 DATA1111111111111111
180 DATA0000011111100000
190 DATA0000011111100000
200 DATA0000011111100000
210 DATA0000011111100000
220 DATA0000011111100000
230 DATA0000011111100000
240 DATA0000011111100000
250 DATA0000011111100000
(FOR ~ NEXT文は、1回のループでDATA文の1行づつの
処理をしていきます。)
40行で、 L$=L$+CHR$(VAL("&B"+LEFT$(DT$,8)))
左半分( 8x16文字)を、CHR$で文字にしてL$に入れます。
(左上と左下になります)
LEFT$(DT$,8)は、
DT$の中の文字列を、左から8文字抜き出すという命令です。
50行で、 R$=R$+CHR$(VAL("&B"+RIGHT$(DT$,8) ) )
右半分( 8x16文字)を、CHR$で文字にしてR$に入れます。
(右上と右下になります)
RIGHT$(DT$,8)
DT$の中の文字列を、右から8文字抜き出すという命令です。
(LEFT$とRIGHT$についての詳細は、
下の方に書きました)
70行で、 SPRITE$(0) =L$+R$
SPRITE$(0)に32文字を定義します。
スプライトの表示 PUT SPRITE
PUT SPRITE
機能 : スプライトパターンを画面に表示する。
書式 PUT SPRITE スプライト面番号 , ( x座標 , y座標 ) , 色 , スプライトパターン番号
例 PUT SPRITE 1,(100,50) ,15 , 0
スプライト面番号って何?と思うかもしれません。
x座標とy座標と色はすぐ分かると思います。
この座標に、この色でスプライトを表示します。MSX1のスプライトは、
1色です。
スプライトパターン番号は、先ほどのSPRITE$( )で定義したスプライトの形です。
スプライトって、小さいキャラクターを自由自在に動かすものというイメージが
ありました。
アニメ制作でよく例えられるのですが、
スプライト画面は、画面サイズのアニメセル(透明なシートみたいなの)があって、
その1枚の、ある位置にキャラクターを描いてある感じです。
その複数のアニメセルと背景を重ね合わせて画面を表示しています。
(スプライト画面1つ付き、キャラクター1つ)
MSXの場合、スプライト面番号は、32枚あります。(0~31)
32枚のスプライト画面があって、重ね合わせて表示します。
まぁ〜、32個のスプライトが表示できるとだけ思っていてもいいかも
しれませんw
一度に表示できる32個のスプライトは、32個のスプライト面番号のことって
ことでいいと思います。
スプライトの表示で一番簡単なのは、
PUT SPRITE 0,(100,50) ,15 , 0
ってスプライト面番号とスプライトパターン番号を同じにしといてやれば
いいでしょう。
シューティングの戦闘機のスプライトならこんな感じでいいと思います。
(アニメーションとかないから)
(最終的には、歩行アニメーションもやりたいですけど、ね!)
アニメーションのヒント
プログラムでつくってやらないといけません。
スプライトパターン番号を随時、変えてやります。
歩行の時は、例えばスプライトパターン番号0とスプライトパターン番号1を
交互に入れ替えてやるとか。
こちらで少しプログラムを書いています。
WebMSXでMSX BASIC の自作ゲーム作成!第一弾。キャラを動かすプログラムを書きました(URLクリックで実行できます) - ニャオニャオ21世紀
もう少しわかりやすく書きたいなぁ^^ いつか書きます。
ちょっとしたテクニックを。
MSX1の画面は、256x192ドットです。
これも忘れているかも。
今となっては、この荒さが逆にいいですよねw
MSXは、左上が( 0 , 0 )で、 右下が(255,191)です。
このあたりは特に覚えてない可能性がありますw
unityなんかだと、y座標は上方向がプラスです。
unityは自然な書き方だと思います。
MSXの場合は、y座標は下方向がプラスです。
MSX1の画面のy座標
y=0
y=191
通常と逆です。
ここが要チェックです!
ここでテクニックの紹介を。
PUT SPRITEで、
y=209
とすると、そのスプライト面のスプライトパターンを消去します。
例
PUT SPRITE 0,(0,209)
としてやると、スプライトが消えます!
(スプライトは見えなくなるけど、スプライトそのものはどうなるんだろう?
ごめんなさい、勉強不足です;)
ちょっとしたテクニックでした^^
READ / DATA データの読み込み
READ
機能 : DATA文で定義したデータを読み込み、変数に入れる。
書式 READ 変数名
例 : READ A
とか、
READ A$
とか、
READ A , B , C$
など。
DATA文を探し出して、
DATA文の並びの、上から順番に読み込んでいきます。
区切りごとに読み込みます。(1行文だったり、コンマで区切られた値ごとだったり)
そして変数にいれます。
DATA
機能 : READ文で読み出すデータを定義します。
書式 DATA 定数
例 DATA 10
DATA 25
DATA 38
などと普通は並べて、最後の方に書きます。
エミュレータのwebmsxだけかもしれませんが、
DATA 00111100
のようにDATAと数字の間にスペースがあると
DATAの読み込みができません。
DATA00111100
と詰めて書けばOKです。
ps. 現在は直っています^^
CHR$ キャラクターダラー関数
CHR$
機能 : キャラクターコード(数字)に対応した文字を得ます。
書式 CHR$ (数字)
例 : PRINT CHR$(65)
Aが表示されます。
PRINT CHR$(&H41)
Aが表示されます。
(&H41は16進数。10進数では65)
(キャラクターコード表はまた後日追記します)
VAL 数字にします
VAL
機能 : 文字列を数値にする
書式 VAL ( 文字列 )
例 : PRINT VAL("&HFF")
255が表示されます。
データ型には、文字型、整数型などがあります。
このVALは文字型を、数値型に変えてくれます。
例えば、
文字型の255を、数値の255にします。
そうすると計算に使えたりします。
具体的には、A$=255 を、VAL(A$)みたいに使います。
LEFT$ 左から文字をいくつか抜き出す
LEFT$(文字列 , 数)
文字列の左から、数の分だけ文字列を抜き出します。
例 : PRINT LEFT$("ABCDEF" , 3)
結果 ABC
RIGHT$ 右から文字をいくつか抜き出す
RIGHT$(文字列 , 数)
文字列の右から、数の分だけ文字列を抜き出します。
例 : PRINT RIGHT$("ABCDEF" , 3)
結果 DEF
2進数と16進数は、どうやって区別するのか?
2進数の前には、&Bをつけます。
&B00000001
みたいな感じです。
16進数の前には、&Hをつけます。
&H01
みたいな感じです。
ちなみに10進数の前には、何もつけません。
スプライトの移動は?
10 SCREEN 1,2 :X=128:Y=96:
20 FOR I=0 TO 15
30 READ DT$
40 L$=L$+CHR$(VAL("&B"+LEFT$(DT$,8)))
50 R$=R$+CHR$(VAL("&B"+RIGHT$(DT$,8)))
60 NEXT
70 SPRITE$(0) =L$+R$
80 S=STICK(0)
90 IF S=1 THEN Y=Y-1
100 IF S=2 THEN X=X+1:Y=Y-1
110 IF S=3 THEN X=X+1
120 IF S=4 THEN X=X+1:Y=Y+1
130 IF S=5 THEN Y=Y+1
140 IF S=6 THEN X=X-1:Y=Y+1
150 IF S=7 THEN X=X-1
160 IF S=8 THEN X=X-1:Y=Y-1
170 PUT SPRITE 0,(X ,Y),15,0
180 GOTO 80
1000 DATA0000000110000000
1010 DATA1000110110110000
1020 DATA1001111001111000
1030 DATA1011111111111100
1040 DATA1010000000000100
1050 DATA1010111111110101
1060 DATA1110101111010111
1070 DATA1010101111010100
1080 DATA1000111111110000
1090 DATA1000011111100000
1100 DATA1110000000011111
1110 DATA1110011111011011
1120 DATA1110111111010001
1130 DATA1000001001011011
1140 DATA0000110110111011
1150 DATA0000111001101110
このスプライトが上下左右斜めと動かすことができます。
(一番わかりやすいプログラムで書いています。
もっといい方法が色々あります。またどこかで書きます)
80行 S=STICK(0)はカーソルキーの入力方向を得ています。
上を押すと S=1、
右上を押すと S=2、
右を押すと S=3、
右下を押すと S=4、
下を押すと S=5、
左下を押すと S=6、
左を押すと S=7、
左上を押すと S=8、 が入ります。
図にすると
1
8 ↑ 2
7 ← → 3
6 ↓ 4
5
90行以降の
90 IF S=1 THEN Y=Y-1
〜
の1は1ドットという意味ですので、2とか4とか8にしてやれば、
もっと早く動きます。
180行で、GOTO 80となっていますが、
80行は、 S=STICK(0)
カーソルキーの入力を取得します。
(このようにゲームでは、一番最後の行まで(DATA文を除く)行ったら、
GOTOなどで、多くのプログラムが、STICK()命令に戻します。つまりループさせます。)
ちなみにプログラムを止めるのは、CTRLキー + STOPキーです。
(webMSXの場合、control + F9です)
小学校のときはここまでは出来ました^^
ここで満足してしまったというか、ブロックとの当たり判定などが
分からなかったんです( ;∀;)
ドット絵もうまく描けなかったなぁ〜^^
壁との当たり判定は、次回、一番簡単な方法を書きたいと思います^^
スプライトの移動について、以前、こちらのページに書きました。
(歩行アニメーション、スプライトの2枚重ねなどもしています)
よろしければ、ご参考にしてください^^
WebMSXでMSX BASIC の自作ゲーム作成!第一弾。キャラを動かすプログラムを書きました(URLクリックで実行できます) - ニャオニャオ21世紀
まとめ
なかなか大変だったのではないでしょうか?
思い出されたでしょうか?
きれいさっぱり忘れていた方のほうが多いと思いますw
はじめての方は、
全部理解しなくてもいいです。
プログラムはいろいろ書いたり、模写したりしているうちに、
よく見かける命令文を覚えていくものです。
昔、僕もスプライトを動かすところまではやっていたと書きましたが、
意味も分からず、サンプルコードを使いまわしていただけです^^
プログラムは、サンプルの切り貼りだけで十分動くのがいいですね^^
より深く知ると、もっと面白くなってきます!
当時はなんで動いているのか分からなかった、
ベーマガ や MSX FAN のプログラムが、あーなるほどって理解できるのは
たまりません^^
大人になって勉強すれば理解できるものですよ〜^^
どんどん詳しくなっていくと、コンピュータの仕組みも分かるようになってきます。
MSXってシンプルな仕組みなので、理解しやすいです。
今のコンピュータはより高度になっていますが、
8bitPCから順に進化していったんだなぁと実感できるようになるかもしれません。
(メモリとか、VRAMの構造とか知っていくのも面白いですね)
MSX実機が欲しい方はこちらでどうぞ。
スプライトだけでゲームが作れます!
とても易しく説明しましたので、よかったらみて下さい^^
続きはこちらへ
アスキー
売り上げランキング: 366,184