敵と自機弾の当たり判定(1/2)

 自機の弾が敵に当たっているかどうかを判定します。

 1.変数の初期設定をする
 2.敵と自機弾の当たり判定を行う
 3.敵がダメージを受けている時の処理
 4.敵が爆発中の処理
 5.敵がダメージを受けている絵を表示する
 6.敵の爆発を表示する
 7.スコア、残機数を表示する

 弾が当たると敵はダメージを受け、ダメージが一定量になると爆発します。ダメージを受けたら、敵が白く光るようにします。爆発したらスコアを加算します。スコアがある値になるとワンアップ(自機が一機増える)します。

 1.変数の初期設定をする

「プログラム起動時の初期設定」部分に以下の4点を加えます。
    hiscore=50000
    dim enelife,10
    dim dmgcnt,10
    dim eplcnt,10
 hiscoreはハイスコアです。プログラム起動時には5万点にすることにします。
 それぞれの敵はヒットポイントのようなものを持っていて、ダメージを受けるごとに減っていき、0になると爆発するものとします。「硬さ」という言い方をよくします。この耐久度が大きいほど、「硬い」と言います。硬さenelifeの配列変数宣言をここでやります。(eneはenemyの略です。)
 敵がダメージを受けている時の処理のために使うカウンタdmgcnt、敵が爆発中の処理のために使うカウンタeplcntの配列変数宣言もここでやります。(dmgはdamage、eplはexplosionの略です。) 

「ゲームスタート時の初期設定」処理を、「ステージスタート時の初期設定」処理の前に追加します。
 スコアを0点にします。
    score=0
 ワンアップは最初5万点で、以降15万点、25万点、……と、10万点ごとに1機増えることにします。
    oneup=50000
 自機は最初3機あるものとします。
    nplayer=3
 (nはnumberの略です。)

 硬さenelifeの初期値はどこで入れたらいいかというと、敵が出現した時に設定するのが妥当ですから、「敵の出現」処理に追加します。
    ; 敵の出現
    if mappnt\64=0 {
        n=0
        w=-1
        repeat 10
            if enemyf.cnt=0 {
         ・
         ・
         ・
                enelife.cnt=3
         ・
         ・
         ・
            }
        loop
    }

 2.敵と自機弾の当たり判定を行う

 敵の絵と自機弾の絵とで重なっている部分があるかどうかを判別するのは、非常に難しいです。そこで、それぞれのキャラクタを四角形で近似します。四角形同士が重なっていれば、当たっていると判定します。
  敵と自機弾の当たり判定
 敵のサイズが32×32ドット、自機弾のサイズが4×16ドットですから、当たり判定は以下のようになります。
    repeat 4
        if shotf.cnt=1 {
            x=shotx.cnt:y=shoty.cnt
            f=0
            repeat 10
                if ((enemyf.cnt=1)|(enemyf.cnt=2))&(x<(enemyx.cnt+32))&
                    ((x+4)>enemyx.cnt)&(y<(enemyy.cnt+32))&((y+16)>enemyy.cnt) {
                    f=1
                    敵に自機弾が当たった時の処理
                }
            loop
            if f=1 { shotf.cnt=0 }
        }
    loop
 4つの自機弾それぞれにつき、10匹の敵と当たっているかどうかを判定します。変数fは、どれかの敵と当たったら1に、どれにも当たっていなかったら0になります。fが1の時、その弾を消去しています。
 図と2つめのif文が結びつかない人は、x<=(enemyx.cnt+31)とx<(enemyx.cnt+32)は同じである点に注意して下さい。
 敵がダメージを受けたら、少しの間白く光らせることにします。また爆発したら、爆発のアニメーションを表示し、それから消滅します。そこで、敵の存在フラグenemyfの意味を下記のように変更します。

 当たり判定を行うのは、enemyfが1か2の時です。爆発中にさらに自機弾に当たるのはおかしいです。ダメージを受けている最中に連続して弾に当たるのは別に構いません。

 敵を"少しの間"光らせるのにも、爆発のアニメーションをやるのにもカウンタが必要となります。それぞれをdmgcnt、eplcntとします。敵がダメージを受けたらdmgcntに0を代入し、1ずつ増やしていき、ある値(ここでは3とします)になるまで敵を白く光らせます。3になったら、存在フラグをダメージを受けている状態から通常の状態に戻します。また敵が爆発したらeplcntに0を代入し、やはり1ずつ増やしていきます。この値によって、爆発の絵を変えていきます。ある値(ここでは15とします)になったら、存在フラグを爆発中から消滅に変えます。
  敵のライフサイクル
「敵に自機弾が当たった時の処理」では、存在フラグenemyfを2にし、dmgcntに0を入れ、ヒットポイントenelifeを1減らします。
    enemyf.cnt=2
    dmgcnt.cnt=0
    enelife.cnt=enelife.cnt-1
 この時、enelifeが0になったら、enemyfを3にし、eplcntに0を入れます。また、scoreを200点加算します。もしscoreがhiscoreを上回ったらhiscoreを更新します。scoreがoneup以上になったら残機数nplayerを1増やすとともにoneupに10万を足します。
    if enelife.cnt=0 {
        enemyf.cnt=3
        eplcnt.cnt=0
        score=score+200
        if score>hiscore { hiscore=score }
        if score>=oneup {
            nplayer=nplayer+1
            oneup=oneup+100000
        }
    }

 まとめますと、「敵と自機弾の当たり判定を行う」処理は以下のようになります。
    repeat 4
        if shotf.cnt=1 {
            x=shotx.cnt:y=shoty.cnt
            f=0
            repeat 10
                if ((enemyf.cnt=1)|(enemyf.cnt=2))&(x<(enemyx.cnt+32))&
                    ((x+4)>enemyx.cnt)&(y<(enemyy.cnt+32))&((y+16)>enemyy.cnt) {
                    f=1
                    enemyf.cnt=2
                    dmgcnt.cnt=0
                    enelife.cnt=enelife.cnt-1
                    if enelife.cnt=0 {
                        enemyf.cnt=3
                        eplcnt.cnt=0
                        score=score+200
                        if score>hiscore { hiscore=score }
                        if score>=oneup {
                            nplayer=nplayer+1
                            oneup=oneup+100000
                        }
                    }
                }
            loop
            if f=1 { shotf.cnt=0 }
        }
    loop

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