趣味のプログラミング(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行目に戻って、また自機の移動、ミサイルの処理…というように繰り返すようにします。
画面イメージ
こんな感じです。
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