4. 衝撃波の計算と敵の一掃
ボムが発動したら、次は衝撃波を広げ、敵との当たり判定を行います。
これは update() 関数の中で行われる計算処理です。
update() 関数の冒頭に、以下の「システム更新」部分を追加してください。
# 毎フレーム実行される更新処理 (計算などはここで行う。描画は禁止)
def update():
global player_x, player_y, score, game_over
global num_bombs, is_bomb_active, bomb_radius # global宣言を追加
global bullets, enemies, particles
# --- 1. ゲームオーバー / クリアチェック ---
if game_over:
return
# --- 2. システム更新 (ボム) # ここから追加
if is_bomb_active: # ボムが発動中なら
bomb_radius += 4 # 半径を徐々に大きくする
if bomb_radius > 200: # 画面外まで広がったら
is_bomb_active = False # ボムを非発動状態にする
bomb_radius = 0 # 半径をリセット
is_bomb_active が True の間、bomb_radius の値が毎フレーム4ずつ増えていきます。これにより、衝撃波が画面いっぱいに広がっていく様子を表現できます。
bomb_radius が 200 を超えたら、ボムの発動を終了しています。
次に、この広がる衝撃波と敵との当たり判定を実装します。
update() 関数内の「敵の更新」ループの中で、敵が破壊されるかどうかをチェックする部分に以下のコードを追加してください。
# 敵の更新
surviving_enemies = []
for e in enemies:
# (省略)
destroyed = False
if is_bomb_active: # ボムが発動中であれば
# ボムの範囲 (中心座標から左上座標を計算)
# pyxel.circb() は中心座標を使うが、check_collision() は左上座標を使うので変換
bomb_x = player_x + 4 - bomb_radius
bomb_y = player_y + 4 - bomb_radius
bomb_size = bomb_radius * 2 # 半径を直径に変換
if check_collision(bomb_x, bomb_y, bomb_size, bomb_size, e['x'], e['y'], ENEMY_W, ENEMY_H):
destroyed = True # 当たっていたら破壊フラグを立てる
if destroyed:
spawn_particles(e['x'], e['y'], 5, COL_WHITE) # 爆発エフェクトを生成
if e['type'] != 'bullet': score += 10 # 弾じゃない敵ならスコア加算
continue # この敵は消滅させるので、surviving_enemies には追加しない
bomb_x = player_x + 4 - bomb_radius の部分では、プレイヤーの中心座標(プレイヤーの幅が8なので player_x + 4)から、bomb_radius を使って四角形の左上座標を計算しています。
pyxel.circb() は中心座標を使いますが、前回
実践:命中!敵を撃破 で作った check_collision() 関数は左上座標と幅・高さを使うため、変換が必要です。
bomb_size = bomb_radius * 2 で、半径からボムのヒット判定用の四角形のサイズ(直径)を求めています。
check_collision() 関数を使って、ボムのヒット範囲と敵が衝突しているかを判定します。
- 衝突していた場合、
destroyed = True となり、敵が破壊された時の処理 (spawn_particles() やスコア加算) が実行され、surviving_enemies リストには追加されないため、次のフレームでは消滅します。