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

 1.ステージスタート時の初期設定
 2.自機と敵、敵弾の当たり判定
 3.自機爆発中の処理
 4.自機復活中の処理
 5.自機を描画
 6.ゲームオーバー処理
 7.影響がある箇所を修正する
 8.キー、ジョイパッドの入力を修正する

 自機に敵、敵弾が当たっているかどうかを判定します。当たっていれば、自機を爆発させます。残機を1つ減らし、0になればゲームオーバーです。0でなければ自機をその場で復活させます。


 1.ステージスタート時の初期設定

 自機の状態を表す変数playerfを追加します。

  自機のライフサイクル
 ステージスタート時は通常状態なので、
    playerf=1
 を追加します。

 2.自機と敵、敵弾の当たり判定

「敵と自機弾の当たり判定」の時と同様、キャラクタを四角形とみなして当たり判定を行います。ただし、ここで注意していただきたいのは、見た目の大きさと同じ四角形で当たり判定を行わない方がいいという事です。敵と自機は32×32ドットです。敵弾は8×8ドットです。これで当たり判定を行うと、プログラム的にはちゃんと当たっていても、人間の目には近寄っただけでやられてしまったように見えてしまいます。そこでここでは、敵と敵弾はそのままの大きさとして、自機は真ん中の2×2ドットの矩形にしか、当たりと判定する領域がないものとします。(「2×2ドットの矩形にしか当たりと判定する領域がない」は、よく「2×2ドットの矩形にしか当たり判定がない」と表現されます。また、当たり判定の領域が大きいことを「当たり判定がきつい」とか「当たり判定が厳しい」と表現します。)
  敵と自機の当たり判定
 シューティングゲーム、特に弾幕系(画面を覆いつくさんばかりに敵弾が出るタイプ)の場合は、自機の真ん中1ドットにしか当たり判定がないくらいでちょうどいいと思います。ここでは、自機の幅、高さのドット数が偶数なので、2×2ドットにしています。

 すると自機と敵の当たり判定は、
    repeat 10
        if ((enemyf.cnt=1)|(enemyf.cnt=2))&((playerx+15)<=(enemyx.cnt+31))&
            ((playerx+16)>=enemyx.cnt)&((playery+15)<=(enemyy.cnt+31))&
            ((playery+16)>=enemyy.cnt) {
                当たった時の処理
        }
    loop
 となります。敵が通常状態(enemyf.cnt=1)の時かダメージを受けている(enemyf.cnt=2)時にのみ当たり判定を行います。
 自機と敵弾の当たり判定は、
    repeat 100
        if (eshotf.cnt=1)&((playerx+15)<=(eshotx.cnt+7))&((playerx+16)>=eshotx.cnt)&
            ((playery+15)<=(eshoty.cnt+7))&((playery+16)>=eshoty.cnt) {
                当たった時の処理
        }
    loop
 となります。

 自機が敵に当たると敵にダメージを与えます。これは自機の弾が敵に当たった時の処理と同じです。そこでこの処理をサブルーチン化します。
    *Enemy_Dmg
        ; enemyno : 敵の要素番号

        enemyf.enemyno=2
        dmgcnt.enemyno=0
        enelife.enemyno=enelife.enemyno-1
        if enelife.enemyno=0 {
            enemyf.enemyno=3
            eplcnt.enemyno=0
            score=score+200
            if score>hiscore { hiscore=score }
            if score>=oneup {
                nplayer=nplayer+1
                oneup=oneup+100000
            }
        }
        return

 自機が敵の弾に当たったら、該当する弾を消します。
 まとめますと、自機と敵、敵弾の当たり判定は以下のようになります。
    if playerf=1 {
        f=0
        repeat 10
            if ((enemyf.cnt=1)|(enemyf.cnt=2))&((playerx+15)<=(enemyx.cnt+31))&
                ((playerx+16)>=enemyx.cnt)&((playery+15)<=(enemyy.cnt+31))&
                ((playery+16)>=enemyy.cnt) {
                f=1
                enemyno=cnt
                gosub *Enemy_Dmg
            }
        loop
        repeat 100
            if (eshotf.cnt=1)&((playerx+15)<=(eshotx.cnt+7))&((playerx+16)>=eshotx.cnt)
                &((playery+15)<=(eshoty.cnt+7))&((playery+16)>=eshoty.cnt) {
                f=1
                eshotf.cnt=0
            }
        loop
        if f=1 {
            playerf=3
            peplcnt=0
        }
    }

 自機が通常状態の時のみ当たり判定を行います。
 fは当たり判定用のフラグで、どれか1つでも敵か敵の弾に当たったら1になります。どれにも当たっていなかったら0になります。fが1だった場合、自機の状態を「爆発中」に変更します。peplcntは爆発アニメーション用のカウンターです。(pはplayer、eplはexplosion、cntはcounterの略です。)
 別に爆発する自機の上を敵や敵の弾が素通りしても構わないのですが、衝突しているのですから、ダメージを与えたり、弾を消したりした方が、自然に見えるかと思います。


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