諸々の記録

その時々 興味にある事について

ラズパイPico で BASIC が動く「MachiKania type P/PU」のインベーダーをUSBキーボードで操作できるようにしてみた

これまで、ラズパイPico で BASIC が動く「MachiKania type PU」のケースばかり作ってたのですが(そして時々ゲームで遊んでた)、インベーダーゲームのソースを修正してUSBキーボードで操作できるように修正してみようと思いました。

あ、ちなみにタクトスイッチでゲームしかやってたので気が付きませんでしたが、USBキーボードを接続してBASIC のプログラミングするだけならタクトスイッチの操作は不要なのですね。(今更知ったw)
なので、ゲームもキーボードで操作できるようにしておけばタクトスイッチでの操作はまったく不要になるのです。

このインベーダーゲームのプログラム、ALL BASIC で書かれてるので(ALL BASIC でこの再現度はすごい!)、押されたキー情報を取得している部分だけを探してUSBキーボードでも操作できるように修正してみます。


KM-BASIC のマニュアルをみると、INKEY() というコマンドでUSBキーボードのキーの値が取得できるようです。

http://www.ze.em-net.ne.jp/~kenken/machikania/machikania-guide.pdf


まずは、キーボードのキーを押したらどんな値になるか、下のようなプログラムを作って実行。

KEYTEST.BAS

CLS
LABEL KEY
K=INKEY()
Z=KEYS()
IF K=0 AND Z=0 THEN
ELSE
 PRINT K,Z
ENDIF
WAIT 20
GOTO KEY


インベーダーゲームの砲台(自機)の移動は、カーソルキーの左右で、FIREはスペースキーにしたいと思い、上のプログラムを実行して調べると各キーを押したときの値はそれぞれ下のようになりました。

 カーソルキー左: 37
 カーソルキー右: 39
 スペースキー: 32

INVADE.BAS のソースコードを見てみると、 BUTTON というサブルーチンがあり、ここにUSBキーボードを押したときの処理を書けばよいようですので、BUTTON サブルーチンを下のように修正しました。

INVADE.BAS  (LABEL BUTTON)

CREM READ BUTTONS
LABEL BUTTON
J=K
K=0
K=KEYS()
Z=INKEY()
IF Z=32 THEN
 K=32
ELSEIF Z=37 THEN
 K=4
ELSEIF Z=39 THEN
 K=8
ENDIF
I=(J XOR 63) AND K
RETURN


MachiKania のタクトスイッチでも動作するように元の記述も残して共存できるようにしておきました。

そして無事(あっさりw)キーボードで操作できるようになりました。
やはりタクトスイッチよりはキーボードでの操作の方が操作しやすいですね!

ついでに、ゲーム開始時に STARTボタン を押さなくてもUSBキーボードのなにかキーを押せばゲーム開始するように INITGM サブルーチンを下記のように修正しました。

NVADE.BAS  (LABEL INITGM)

REM INIT FOR EVERY GAME
LABEL INITGM
GPRINT 40,80,7,0,"SPACE ALIEN"
GPRINT 24,110,7,0,"PUSH START BUTTON"
WHILE KEYS(16)=0 AND INKEY()=0:WAIT 1:P=RND():WEND
P=0:R=0:L=3
GCLS
RETURN

5行目に AND INKEY()=0 を追加しただけです。
これでタクトスイッチをまったく使わないでインベーダーゲームができるようになりました。

他のゲームもUSBキーボード操作に変更したくなりましたw