シューティングゲームを作ろう その9 |
16.自機と敵、敵の弾との当たり判定 |
;自機と敵、敵の弾との当たり判定 if myship_state == 1 { f = 0 cx = myship_x + 16 cy = myship_y + 16 for i, 0, ENEMAX if enemy_state(i) == 1 & cx >= enemy_x(i) & cx <= enemy_x(i) + 31 & cy >= enemy_y(i) & cy <= enemy_y(i) + 31 { enemy_state(i) = 0 f = 1 } next for i, 0, ESHOTMAX if eshot_f(i) == 1 & cx >= eshot_x(i) & cx <= eshot_x(i) + 15 & cy >= eshot_y(i) & cy <= eshot_y(i) + 15 { eshot_f(i) = 0 f = 1 } next if f == 1 { dsplay 2 myship_state = 2 myexplode_cnt = 0 } }
自機が爆発中は敵、敵の弾との当たり判定を行いません。また復活中は無敵なのでやはり当たり判定を行いません。つまり、自機が通常状態の時のみ当たり判定を行います。
fは自機が敵または敵の弾に当たったかどうかのフラグで、どれか一つにでも当たっていれば1、そうでなければ0とします。
自機は真ん中1ドットにしか当たり判定がないものとします。
爆発中の敵には当たりませんから、通常状態の敵とのみ当たり判定を行います。弾は存在するものと当たり判定を行います。
爆発する自機を敵や弾が素通りしても構わないのですが、当たっているのですから消した方が自然です。
当たっていれば、自機の爆発音を鳴らし、自機の状態を「爆発中」にし、自機の爆発用カウンタを0にします。
17.自機が爆発中の処理 |
;自機が爆発中の処理 if myship_state == 2 { myexplode_cnt++ if myexplode_cnt == 100 { n_myship-- if n_myship > 0 { myship_state = 3 myrevival_cnt = 0 myship_x = (GWIDTH - 32) / 2 myship_y = GHEIGHT - 64 } else { ;GAME OVER処理 mci "stop bgm" msx = 208 : msy = 232 message = "GAME OVER" gosub *Write_Message wait 300 goto *Title_Screen } } }
自機の状態が「爆発中」であれば、爆発用カウンタを1増やし続けます。100になったら残機を1機減らします。
残機が0より多ければ自機の状態を「復活中」に変え、復活用カウンタを0にします(revivalは「復活」です)。復活時の位置はステージスタート時と同じとします。
残機が0であればGAME OVER処理を行います。BGMを止め、"GAME OVER"と書き、3秒待ち、タイトル画面に戻ります。
なお、自機が爆発中の処理は自機と敵、敵の弾との当たり判定より前に書きます。
18.自機が復活中の処理 |
;自機が復活中の処理 if myship_state == 3 { myrevival_cnt++ if myrevival_cnt == 200 { myship_state = 1 } }
自機の状態が「復活中」であれば復活用カウンタを1増やし続け、200になったら自機の状態を「通常」に変えます。
なお、自機が復活中の処理は自機が爆発中の処理より前に書きます。