ボム(1/2) |
1.変数の宣言、初期設定 |
2.キー、ジョイパッドの入力を修正する |
3.ボムを爆発させる |
4.ボム爆発中の処理 |
5.ボムが敵にダメージを与える処理 |
6.自機爆発中の処理を修正する |
7.ボム爆発の描画 |
8.ボム残り数表示 |
ボム(またはそれに類するもの)も、様々な種類がありますね。
1.変数の宣言、初期設定 |
「画面のあちこちで爆発が起こり」と書きましたが、1度に10個の爆煙を描こうと思います。そこで、「プログラム起動時の初期設定」に爆煙の座標の配列変数宣言を追加します。
dim bombx,10:dim bomby,10
「ゲームスタート時の初期設定」で、ボムの個数を設定します。
nbomb=3
「ステージスタート時の初期設定」で、ボム用のカウンターを−1に設定します。
bombcnt=-1
今までカウンターの初期値は0に設定していましたが、これについては−1の時ボムが爆発していない状態、それ以外の時は爆発中の状態とします。
2.キー、ジョイパッドの入力を修正する |
ボムを爆発させるためのボタンが必要ですので、「キー、ジョイパッドの入力」サブルーチンを修正します。ここではShiftキー、ジョイパッドのボタン2をボムボタンに割り当てます。
変数skeyにその状態を入れるものとします。(shift keyの略です。)
; キー、ジョイパッドの入力
*In_Key
pckey=ckey
pskey=skey ←追加
pukey=ukey
pdkey=dkey
plkey=lkey
prkey=rkey
ckey=0
skey=0 ←追加
ukey=0
dkey=0
lkey=0
rkey=0
digetkeystate key,0
if key&256!0 { ckey=1 }
if key&1!0 { ukey=1 }
if key&2!0 { dkey=1 }
if key&4!0 { lkey=1 }
if key&8!0 { rkey=1 }
digetkeystate key,1
if key&16777216!0 { ukey=1 }
if key&2!0 { dkey=1 }
if key&64!0 { lkey=1 }
if key&1048576!0 { rkey=1 }
digetkeystate key,3 ←追加
if key&(1<<19)!0 { skey=1 } ←追加
if njoy>0 {
digetjoystate key,0
if key&16!0 { ckey=1 }
if key&32!0 { skey=1 } ←追加
if key&1!0 { ukey=1 }
if key&2!0 { dkey=1 }
if key&4!0 { lkey=1 }
if key&8!0 { rkey=1 }
}
return
ジョイパッドのボタン2は第5ビットに対応しています。
Shiftキーの入力はdigetkeystateの第2引数を3にして取得しています。3は「特殊キー」を表します。左Shiftキーは第19ビットに対応します。HMM.DLLのreadmeを参照していただければ分かるのですが、第2引数が0でもShiftキーの入力は取得できます。ただし、この場合左Shiftキーと右Shiftキーを、別々の入力として判別することはできません。右Shiftキーには反応させたくない場合、第2引数を3にする必要があります。
なぜ反応させたくないかというと、「↑」キーのすぐ上にあるからです。これでは、自機を上に動かそうとして、間違ってボムを爆発させてしまうことがあります。
3.ボムを爆発させる |
ボムボタンが押されたら、ボムの個数を1つ減らし、bombcntを0に設定します。
ボムを爆発させる条件は以下の通りです。
4.ボム爆発中の処理 |
ボムが爆発中であれば、敵の弾を全部消します。爆発している間、毎回消し続けます。つまり、ボムボタンを押した瞬間に画面に存在する弾だけでなく、その後新たに発射された弾も消します。
bombcntを1つずつ増やし、爆発完了の値(ここでは60とします)に達したら、bombcntを−1に戻します。
if bombcnt!-1 {
repeat 100
eshotf.cnt=0
loop
bombcnt=bombcnt+1
if bombcnt=60 { bombcnt=-1 }
}
5.ボムが敵にダメージを与える処理 |
ボムが爆発中であれば、敵全部にダメージを与えます。対象となるのは通常またはダメージを受けている状態の敵です。爆発している間、毎回与え続けます。
if bombcnt!-1 {
repeat 10
if (enemyf.cnt=1)|(enemyf.cnt=2) {
enemyno=cnt
gosub *Enemy_Dmg
}
loop
}
毎回1ずつダメージを与える処理をbombcntが60になるまで行いますから、すべての敵に60のダメージを与えることになります。耐久力(enelife)がそれ以下の敵は全滅します。それより硬い敵は生き残ります。もちろん、爆発の途中で出てきた敵にはもっと小さい値のダメージしか与えられません。