2人対戦ゲームのキー設定


 対戦型のアクションゲームを作る場合、コンピュータとの対戦のみではなく2人対戦モードを導入すれば盛り上がること間違いなしですね。ただ、ポケコン1台で2人対戦をするには同時キー入力の処理が必要になります。これはBASICで実現でき特に難しいものではないのですが、使うキーの数や種類によってはキー判定処理が重くなるし、2人プレイ時と1人プレイ時で使うキーが大きく変わればその分リストも長くなってしまうためあまりポケコンBASICに適したものとはいえません。あと2人プレイ時だと使いやすい配列というのも限られますからね。
 ということで、私が対戦型ゲームを作る時によく使っているキー設定について書いておきます。処理速度を速くするためというのと2人プレイ時のキーの煩雑さを避けるために1人あたり使うキーは3つにしてあります。

 1P側 F0h番地に書き込む値・・・ E4h
 2P側 F0h番地に書き込む値・・・ 03h

 この設定で使えるキーは1P側は、[3][6][9]、[1][5][9]([1]の代わりに[SPACE]でもOK)、2P側は[Q][A][Z](もしくは[◆][Q][S])となります。同じ行に並んでいるキーはどれでも使用可能ですが使い勝手が良いと思われるものを抜き出しました。3つでは足りないので4つ欲しいという場合は1P側は[0][1][5][9]、2P側は[◆][Q][A][Z]とすればいいです。

 キーを押したときにF2h番地に書き込まれる値はこのようになります。

キー 書き込まれる値
1P側
[7][8][9]10h
[4][5][6]20h
[1][2][3][SP]40h
2P側
[◆]01h
[Q]02h
[S]04h
[A]08h
[Z]20h

 [3]と[9]を同時に押した時は40h10hを足した50hF2h番地に書き込まれるわけです。メインルーチン内でF0h番地E4hを書き込みF2h番地の値を元に1P側のキー入力判定をし、F0h番地03hを書き込みF2h番地の値を元に2P側のキー入力判定をすれば1P、2Pが同時にキー入力を行っても判定が可能になります。
 [1]と[3]は同じキー(押した際には同じ40hが返される)として扱われますのでこれを同時に使用することはできません。F0hに書き込む値を変えF2番地を2回に分けて読み出しそれを元に判定すれば可能ですが、簡単かつ速いというのがこの設定のウリなのでどうしても必要ならば各自で対応してください。



 この設定を使ってサンプルゲーム「VS50m走」を作ってみました。
 キーを交互に押してキャラ(1P側が上、2P側が下)を右端まで移動させてください。使うキーは1Pが[1]と[9]、2Pが[◆]と[A]になっています。
 キー判定は1P側が30行、2P側が40行です。上記のようにF0h(=240)番地に1PはE4h(=228)、2Pは03hを書き込みF2h(=242)番地を読み出すことでどのキーが押されたのかが分かるようになっています。
 キーの交互押し判定のテクニックを用いてキー判定は高速化しています。1P側は10h(=16)、40h(=64)を交互に繰り返すためにその合計は50h(=80)になりその80が「P=80-P」の80となっています。
 動作速度は20cpsを実現しているので連射をしてもほとんど問題なくキー反応してくれます。なお、同時キー入力を行っているのでキー割り込みを無効化している関係上プレイ中はBREAKが効きません。ゴールしてタイムが表示されている時以外に強制終了させるには、リセットボタンを押してください。

《 「VS 50m走」 プログラムリスト 》

10 CLS :CLEAR :P=16:Q=1:WAIT 99:PRINT "READY ";
20 KEY 0,"POKE&FB,&E3"+CHR$ 13:POKE &FB,&A0:WAIT 0:PRINT "GO!"
30 POKE 240,228:K=PEEK 242:IF P=K THEN P=80-P:X=X+1
40 POKE 240,3:K=PEEK 242:IF Q=K THEN Q=9-Q:Y+Y+1
50 LOCATE X,1:PRINT " P":LOCATE Y,2:PRINT " P"
60 T=T+0.1:IF X<38AND Y<38THEN 30
70 BEEP 1:WAIT :PRINT "GOAL! TIME=";T:POKE &FB,&E3
80 PRINT MID$ ("1P WIN=DRAW=2P WIN",SGN (Y-X)*6+7,6):GOTO 10



RETURN

inserted by FC2 system