ニャオニャオ21世紀

アイデア。レトロゲーム(MSX、PCエンジン、ファミコン、メガドライブセガサターン)と、MSXのゲーム開発と、最新ゲーム(PS4、SWITCH)、身体(身体意識など)、ライフハック、電子工作ほか雑記を綴っています

MSXの特徴であるスプライト プログラム(表示)!初めての方にも。MSX BASICの基本を思い出しましょう、"その2"

MSXの機体の情報が一杯 これは必見の書籍!! 僕らの好きなMSXハードカタログ

今回はスプライトの表示や、スプライトを動かすことの基本を

説明します。

MSX実機がない方はエミュをどうぞ!

今ならブラウザで動くエミュがあります。

webMSXへのリンクはこちら。

webmsx.org

 

webMSXの使い方の説明はこちらへどうぞ。

WebMSXの使い方を調べてみました。 - ニャオニャオ21世紀

 

 

 

その他、MSX BASICの基本のページについての

目次はこちら

www.nyaonyao21.com

 

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で形を作るというものだと思います。     

 

f:id:nyaonyaokun:20180906095540p:plain

これと8文字にどんな関係が?

と思うと思います。 

 

まず、

DATA 00111100

こういう00111100って数字を、そのキャラクターコードに対応する文字にします。

2進数 00111100 は、10進数で60なので

CHR$(60) 

とすると、

<

になります。 

 

こんな感じになります。

f:id:nyaonyaokun:20180908000859p:plain

 =の後に、なにも書いていないところも目に見えない文字がはいっております^^;

 

MSX BASICをどこまで学んでいたかによって、

理解できるところが変わりますが、

私が小学生のころは、上に書いたところがは全くわかりませんでした;

人によっては、思い出したよ!って方もいるかと思います。

 

 初めての方のために、

001111100のような数字を、

キャラクターコード(数字)に対応する文字に変えるというところを

易しく説明します。

分かる方はとばしてください。

 

DATA文の、

00111100って数字の羅列を、2進数として扱います。

まぁ当時は2進数なんて知らなかったですけど^^

 

2進数についてはこちらへ。

MSX マシン語入門(Z80 アセンブラ・機械語) 勉強レポート 第2回 2進数 - ニャオニャオ21世紀

 

2進数のしくみを知らなくても、とりあえずはプログラムはできます。

ご安心ください(^^)

(マシン語とか、BASICでも高度なことをやろうとすると

2進数の仕組みは知っていないとだめですが。暇なときにでもやってください^^)

 

一つの数字を、

2進数で表したり、10進数で表したり、16進数で表したりできるということを

知っていればOKです。

ちなみに、10進数が、日常で普通に使っている数字です。

 

この数字の変換は、今はツールを使えばいいでしょう。

こちらのサイト様で出来ます。

リンクを貼っておきます。

2進数、8進数、10進数、16進数相互変換ツール

 

ちなみに先ほどの、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$で文字にしておかないといけません。

f:id:nyaonyaokun:20180908000859p:plain

 

定義するというのは、

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
 

f:id:nyaonyaokun:20180913151701p:plain

 

このスプライトが上下左右斜めと動かすことができます。

(一番わかりやすいプログラムで書いています。

もっといい方法が色々あります。またどこかで書きます)

 

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実機が欲しい方はこちらでどうぞ。

通販ショップの駿河屋(MSX本体)

 

スプライトだけでゲームが作れます!

とても易しく説明しましたので、よかったらみて下さい^^

www.nyaonyao21.com

 

 

www.nyaonyao21.com

  

続きはこちらへ

www.nyaonyao21.com

 

MSX MAGAZINE 永久保存版 [CD-ROM1枚、特製シール付き]
MSXアソシエーション
アスキー
売り上げランキング: 366,184
 

 

MSX MAGAZINE 永久保存版 2
MSX MAGAZINE 永久保存版 2
posted with amazlet at 18.09.04

アスキー
売り上げランキング: 694,835

 

MSX MAGAZINE永久保存版3
MSX MAGAZINE永久保存版3
posted with amazlet at 18.09.04

アスキー
売り上げランキング: 818,909
僕のはwin10じゃないので試していませんが。
ネットで調べてみてください;)
 
 
 

こちらの方が安いかもしれません^^

msx | 通販ショップの駿河屋
 

「ニャオニャオ21世紀は、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、Amazonアソシエイト・プログラムの参加者です。」

当サイトは第三者配信の広告サービス「Google Adsense グーグルアドセンス」を利用しています。 広告配信事業者は、ユーザーの興味に応じた広告を表示するためにCookie(クッキー)を使用することがあります。 Cookie(クッキー)を無効にする設定およびGoogleアドセンスに関する詳細は「広告 – ポリシーと規約 – Google」をご覧ください