Skip to content

第06回 プレイヤーの被弾と無敵時間 ​

第05回では、敵がプレイヤーを狙って敵弾を発射する処理を実装しました。
第06回では、飛来した敵弾や敵本体が自機に接触したときの「被弾処理」を実装します。

プレイヤーに体力(HP)を持たせます。被弾後の一定時間はダメージを受けない無敵時間と点滅を加え、連続ダメージを防ぎます。

始める前に ​

命中判定の条件分岐と、時間の経過に応じた値の更新を確認してください。確認したい場合は、プレイヤーの弾と敵の命中判定を参照してください。

前の回の受講や完成物は必須ではありません。下の開始用プロジェクトを使い、配布済みの処理と今回追加する処理を確認してから進めます。

配布プロジェクト ​

第06回のプロジェクトを展開し、ShootingGame2D.slnをVisual Studio 2026で開いてください。
第05回で実装した自機狙い弾の反撃機能が含まれたプロジェクトから開始します。

配布ファイル一覧
ファイル役割
Source/Shooting/Player.hプレイヤーのHP・無敵時間・被弾関数の宣言
Source/Shooting/Player.cpp被弾判定(TryTakeDamage)と点滅描画の実装
Source/Shooting/Game.cpp自機と敵弾・敵本体との接触判定の調停
Source/Shooting/EnemyShot.cpp敵弾の命中矩形定義
Source/Shooting/Tuning/GameTuning.h最大HPや無敵時間などの調整値

この回のゴール ​

敵弾や敵本体に接触した際にプレイヤーのHPが減少し、被弾直後は機体が点滅して連続ダメージを防ぐ状態を目指します。

  • 敵弾および敵本体とプレイヤーの接触をRect::Overlaps()で検知できる
  • プレイヤー自身がHPと無敵時間を管理し、被弾の可否を判定するTryTakeDamage()を実装できる
  • 被弾が成立した瞬間のみHPを減らし、一定時間の無敵タイマーを開始できる
  • 無敵時間中に機体を点滅させ、プレイヤーに無敵状態であることを視覚的にフィードバックできる

今回のポイント ​

敵の被弾(TakeDamage)とプレイヤーの被弾(TryTakeDamage)の違い ​

第04回で実装した敵のダメージ処理はTakeDamage()でした。一方、今回のプレイヤーのダメージ処理はTryTakeDamage()という名前を採用しています。

関数名の違いは、処理の役割の違いを表しています。

Enemy::TakeDamage()は、命中すると必ずHPを減らします。戻り値はありません。
Player::TryTakeDamage()は、無敵時間中のダメージを受け付けません。実際にHPを減らした場合だけtrueを返します。

無敵時間があるため、接触してもダメージを受けるとは限りません。TryTakeDamage()で成否を真偽値(bool)として返すと、ダメージが成立したときだけ効果音や被弾エフェクトを出す処理を簡単に追加できます。

被弾の調停と成立判定の流れ
Game
敵弾との接触を検知し TryTakeDamage() を呼び出す
Player
Player
無敵タイマーを確認(タイマー > 0 なら拒否して false を返す)
Player
Player
ダメージ適用、無敵タイマー開始、true を返す
Player
Game
接触した敵弾を消滅(Deactivate)させる
EnemyShot

作業の準備 ​

開始用ZIPには前回までの到達状態が含まれています。今回の新規ファイルは、本文を進めながら追加します。ファイルの登録方法や変更の引き継ぎ手順は、配布ファイルの手順で確認できます。

作業対象
新規作成なし
既存ファイルへ追記・編集Source/Shooting/Game.cpp、Source/Shooting/Player.cpp、Source/Shooting/Player.h、Source/Shooting/Tuning/GameTuning.h
重点的に実装・確認する処理Player::TryTakeDamage、Player::Update、Game::ResolveCollisions

ヘッダーの宣言、#include、登録テーブル、エラー処理などは、最終ステップの参考実装を参照できます。重点関数は各ステップで処理の流れを確認しながら記述します。関数を変更する際は、宣言・定義・呼び出し元の整合性を保ちます。

GameTuning.hには今回必要な定数を追記し、自身で調整した既存の値を維持します。

第06回の目次 ​