モラこじ! ブログモードでGo!

レトロゲーム界隈にずぶずぶハマりつつある40代おっさんの生き様です!

趣味のプログラミング(1)~MSX篇

ニコ生でいつも楽しい配信をされているリハビリ中さんが、MSX でオリジナルキャラを動かしてゲームを作りたい、と仰ってるのを聞いて、「MSX でプログラミングしたことなかったけどやってみようかしらん」と思い、三十数年ぶりの BASIC に挑むことにしました。

…と言っても MSX を所持していないのですが、なんと WebMSX というサイトがあって、ブラウザ上でヴァーチャルな MSX が操作できるのです!

というわけで、早速、自機をカーソルキーかジョイスティックで動かして、ボタンかスペースキーでミサイル発射するプログラムを作ります。

2連射以上可能にすると処理がめんどくさくなるから、今回は1連射(画面内に1発しかミサイルが存在できない)とします。

スプライトの処理は初めてだったので、こちらのサイト

を参考にしました。また、カーソルキー、ジョイスティックの処理は、こちらのサイト

を参考にしました。

ちなみに、起動は run コマンドです。(当たり前ですね)

終了は、プログラムが無限ループなので無理矢理とめます。 WebMSX だと Ctrl+Pause/Break キー(Windowsの場合)です。実機の MSX だと STOP キーでしょうか? 持ってないのでわかりませんが、そのあたりです。

スプライトの定義

10行目、SCREEN1,2 で 16x16 スプライトモードにします。

100~170行目で、1010~1360行目の DATA 文にあるデータを引っ張ってきて、スプライトを定義します。2個で、1個目は自キャラ、2個目はミサイルです。

初期化

210行目。自キャラの初期座標を X, Y に設定します。変数 BB はボタンが押されてミサイルが飛んでいる状態かどうかを表すフラグです。0 がミサイルが飛んでない状態を表すものとします。

自機の移動

310~370行目がキーボードとジョイスティックの状態取得と、自機の移動です。

上下左右で8ドットずつ動くようにしています。

ミサイル発射

410~440行目がミサイルの処理です。BB が 1 だったらミサイルが打たれているとみなして、ミサイルの座標を水平方向に動かします。

420行目は、BB が 0 だったら、かつ、ボタンが押されていたら、BB を 1 にして、ミサイルを打ちます。このとき、ミサイルの座標 BX, BY を自機の座標と同じにします。

440行目では、ミサイルが画面外に出ていったなら、BB を 0 にして、ミサイルが打たれていない状態に戻します。

スプライト表示

510~520行目は、上記の処理をした結果の自機とミサイルの座標をもとに、スプライトを表示します。

520行目では、BB が 1 のときだけミサイルのスプライトを表示して、そうじゃないときは表示しないようにしています。

くりかえす

530行目は、すべての処理が終わったので、300行目に戻って、また自機の移動、ミサイルの処理…というように繰り返すようにします。

画面イメージ

こんな感じです。

f:id:nyagbon:20190214234405p:plain

WebMSX で動かす場合

起動後、画面をクリックし、ALT+B で Input Text というウィンドウが出現します。そこに、ソースコードをすべてコピーして OK ボタンを押します。その後 run コマンドを MSX 内で実行すると、ゲーム(?)が遊べます。

今後の展開

敵がいませんね! 敵をやっつけないとゲームになりません! 敵は自分を攻撃してこないとゲームになりません! 次回はそのあたりを攻めていきたいと思います。それでは、以下のコードでお楽しみください。では~。

ソースコード

10 SCREEN 1,2
100 ' READ SPRITE
110 FOR S=1 TO 2:L$="":R$=""
120 FOR I=1 TO 16:READ I$
130 L$=L$+CHR$(VAL("&B"+LEFT$(I$,8)))
140 R$=R$+CHR$(VAL("&B"+RIGHT$(I$,8)))
150 NEXT
160 SPRITE$(S)=L$+R$
170 NEXT
200 ' INITIALIZE
210 X=180:Y=80:BB=0
300 ' MOVE BY CURSOR KEY OR JOY STICK
310 ST=STICK(0) OR STICK(1)
320 SG=STRIG(0) OR STRIG(1)
330 IF ST=0 THEN 400
340 IF ST>=1 AND ST<=2 AND Y>0 THEN Y=Y-8
350 IF ST>=3 AND ST<=4 AND X<240 THEN X=X+8
360 IF ST>=5 AND ST<=6 AND Y<180 THEN Y=Y+8
370 IF ST>=7 AND ST<=8 AND X>0 THEN X=X-8
400 ' BULLET
410 IF BB=1 THEN 430
420 IF SG<>0 THEN BB=1:BX=X:BY=Y
430 BX=BX-16
440 IF BX<0 THEN BB=0
500 ' PUT SPRITES
510 PUTSPRITE 1,(X,Y),15,1
520 IF BB=1 THEN PUTSPRITE 2,(BX,BY),8,2 ELSE PUTSPRITE 2,,,0
530 GOTO 300
1000 ' MINI RIHA
1010 DATA 0000000000000000
1020 DATA 0000000110000000
1030 DATA 0000001111000000
1040 DATA 0000011111100000
1050 DATA 0000011001100000
1060 DATA 0000111111100000
1070 DATA 0000111111100000
1080 DATA 0011000000000000
1090 DATA 0111111011100000
1100 DATA 0001011101100000
1110 DATA 0000011111100000
1120 DATA 0000010011100000
1130 DATA 0000001111000000
1140 DATA 0000010000100000
1150 DATA 0000100000010000
1160 DATA 0000000000000000
1200 ' BULLET
1210 DATA 0000000000000000
1220 DATA 0000000000000000
1230 DATA 0000000000000000
1240 DATA 0000000000000000
1250 DATA 0000000000000000
1260 DATA 0000000000000000
1270 DATA 0000001111000000
1280 DATA 0000011001100000
1290 DATA 0000001111000000
1300 DATA 0000000000000000
1310 DATA 0000000000000000
1320 DATA 0000000000000000
1330 DATA 0000000000000000
1340 DATA 0000000000000000
1350 DATA 0000000000000000
1360 DATA 0000000000000000