ボム(1/2)

 1.変数の宣言、初期設定
 2.キー、ジョイパッドの入力を修正する
 3.ボムを爆発させる
 4.ボム爆発中の処理
 5.ボムが敵にダメージを与える処理
 6.自機爆発中の処理を修正する
 7.ボム爆発の描画
 8.ボム残り数表示

 ボム(またはそれに類するもの)も、様々な種類がありますね。

 等々。
 このゲームでは、画面のあちこちで爆発が起こり、敵全体にダメージを与えることにします。ボムは最初3発持っているものとします。自機がやられるとボムは3発に戻ります。


 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に設定します。
 ボムを爆発させる条件は以下の通りです。

    if ((playerf=1)|(playerf=2))&(pskey=0)&(skey=1)&(nbomb>0)&(bombcnt=-1) {
        nbomb=nbomb-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)がそれ以下の敵は全滅します。それより硬い敵は生き残ります。もちろん、爆発の途中で出てきた敵にはもっと小さい値のダメージしか与えられません。


[目次へ][前へ][次へ] inserted by FC2 system