シューティングゲームを作ろう その7 |
12.敵の弾の射出 |
毎回弾を出していたら、あっという間に画面が弾だらけになってしまいます。そこで、敵が64回動く毎に1発弾を撃つことにします。
弾は一度に6ドット動くものとします。
種類0番の敵は下に、1番の敵は上に、2番の敵は横に弾を撃ちます。
;敵の弾の射出 for i, 0, ENEMAX if enemy_state(i) == 1 & enemy_x(i) >= 0 & enemy_x(i) <= GWIDTH -32 & enemy_y(i) >= 0 & enemy_y(i) <= GHEIGHT - 32 & enemy_cnt(i) \ 64 == 0 { for n, 0, ESHOTMAX if eshot_f(n) == 0 { _break } next if n != ESHOTMAX { eshot_f(n) = 1 eshot_x(n) = enemy_x(i) + 8 eshot_y(n) = enemy_y(i) + 8 switch enemy_kind(i) case 0: eshot_dx(n) = 0 eshot_dy(n) = 6 swbreak case 1: eshot_dx(n) = 0 eshot_dy(n) = -6 swbreak case 2: if enemy_dx(i) == -3 { eshot_dx(n) = -6 } else { eshot_dx(n) = 6 } eshot_dy(n) = 0 swbreak swend } } next
for i, 0, ENEMAX if enemy_state(i) == 1 & enemy_x(i) >= 0 & enemy_x(i) <= GWIDTH -32 & enemy_y(i) >= 0 & enemy_y(i) <= GHEIGHT - 32 & enemy_cnt(i) \ 64 == 0 {
通常状態の敵のみ弾を撃ちます。爆発中の敵は弾を撃ちません。
敵が画面の外から弾を撃ってくるのは嫌ですから、画面内にいる場合に限り弾を撃ちます。
enemy_cnt(i)が64の倍数の時に弾を撃ちます。
for n, 0, ESHOTMAX if eshot_f(n) == 0 { _break } next
敵の弾の配列変数のうち空いている(存在フラグが0である)要素を探します。その添え字nを取得します。
eshot_f(n) = 1 eshot_x(n) = enemy_x(i) + 8 eshot_y(n) = enemy_y(i) + 8
存在フラグを1にします。弾の出現位置は、敵の真ん中とします。弾の大きさは16×16です。
case 2: if enemy_dx(i) == -3 { eshot_dx(n) = -6 } else { eshot_dx(n) = 6 } eshot_dy(n) = 0 swbreak
種類2番の敵については、敵が左に動いていれば弾も左に、右に動いていれば弾も右に動かします。
13.敵の弾の移動 |
;敵の弾の移動 for i, 0, ESHOTMAX if eshot_f(i) == 1 { eshot_x(i) += eshot_dx(i) eshot_y(i) += eshot_dy(i) if eshot_x(i) <= -16 | eshot_x(i) >= GWIDTH | eshot_y(i) <= -16 | eshot_y(i) >= GHEIGHT { eshot_f(i) = 0 } } next
存在フラグが1である弾のみ移動処理を行います。
弾のx座標、y座標にeshot_dx(i)、eshot_dy(i)を足しこみます。
弾が画面外に出たら消します。
なお、敵の弾の移動処理は敵の弾の射出処理より前に書きます。