Appearance
第20回 アニメーションと音声イベント
第19回までで、地形との衝突判定およびジャンプ・落下の移動処理が完成しました。
第20回では、スプライトシートを用いたアニメーション描画と、音声イベント(SE・BGM)の連携を実装します。
プレイヤーの速度や接地状態に応じて「待機」「走行」「ジャンプ上昇」「落下」のコマを切り替えるとともに、第18回で設計したジャンプや着地のイベント通知(PlayerEvents)を Game クラス経由で SoundManager へ接続し、効果音を鳴らす仕組みを構築します。
配布プロジェクト
第20回の開始用プロジェクトを展開し、PlatformerGame2D.sln を Visual Studio 2026 で開いてください。
第19回の衝突判定が完成した状態から開始します。
配布ファイル一覧
| ファイル | 役割 |
|---|---|
Source/Platformer/Player.h / Player.cpp | スプライトシート切り出し、アニメーション状態更新、イベント通知 |
Source/Platformer/Tuning/GameTuning.h | 各アニメーションのコマ送り速度の調整値 |
Assets/Sounds/ | ジャンプ音(Jump.wav)、着地音(Land.wav)、BGM(StageBgm.wav) |
この回のゴール
プレイヤーの接地状態や移動速度に応じて、待機・走行・上昇・落下の各ポーズへ自然にアニメーションが切り替わる状態を実装します。
また、進行方向に応じた画像の左右反転や、ジャンプ時・着地時の効果音(SE)が1回だけ鳴ることを確認します。
- スプライトシートから指定コマを矩形切り出し(
DrawRectGraph)して描画できる - 物理状態(接地フラグ・水平速度・垂直速度)の優先順位に従ってアニメーション状態を選択できる
PlayerEvents構造体を用いて、移動ロジックと演出処理(音声)を疎結合に分離できるSoundManagerを構築し、イベント成立に合わせてBGMと効果音を再生できる
今回のポイント
キー入力ではなく物理状態からアニメーションを決める
アニメーションの種類をキー入力だけで判定すると、空中で横キーを押した際に空中を走行するような不自然な見た目になります。
そのため、キー入力ではなくプレイヤーの物理状態(接地中か、落下中かなど)を基準に判定します。
接地判定
接地フラグがオフ(空中)
空中判定
空中判定
上昇中(Y速度 < 0)
ジャンプ姿勢
空中判定
降下中(Y速度 >= 0)
落下姿勢
接地判定
接地フラグがオン(地上)
地上判定
地上判定
水平移動中(|X速度| > 0.1)
走行アニメ
地上判定
静止中(|X速度| <= 0.1)
待機アニメ
移動処理と演出の疎結合化
プレイヤー自身が直接音声を再生するのではなく、発生した出来事(jumped, landed)を PlayerEvents 構造体として返し、Game クラスが SoundManager を呼び出します。これにより、物理移動ロジックと音声演出の依存関係を分離します。
Player
jumped、landed イベントを返す
Game
Game
対応するSEを1回再生
SoundManager
作業の準備
開始用ZIPは前回までの到達状態です。今回の新規ファイルは、本文を進めながら追加します。ファイルの登録方法と自分の変更の引き継ぎは、配布ファイルの手順で確認できます。
| 作業 | 対象 |
|---|---|
| 新規作成 | Source/Platformer/SoundManager.cpp、Source/Platformer/SoundManager.h |
| 既存ファイルへ追記・編集 | Source/Platformer/Game.cpp、Source/Platformer/Game.h、Source/Platformer/Player.cpp、Source/Platformer/Player.h、Source/Platformer/Tuning/GameTuning.h |
| 重点的に実装・確認する処理 | Player::UpdateAnimation()、Game::HandlePlayerEvents() |
ヘッダーの宣言、include、画像などの登録表、読み込みのエラー処理は、最終ステップの参考実装を必要に応じて利用します。重点関数は各ステップで処理の理由を確かめながら記述します。関数を変更するときは、宣言・定義・呼び出し元の整合性を保ちます。
必要に応じて GameTuning.h に定数を追加し、アニメーション速度などの調整を行います。追加する音声素材は Assets/Sounds/ フォルダへ配置します。
第20回の目次
1 / 4スプライトシートの部分描画と左右反転横一列に並んだキャラクター画像(スプライトシート)から指定した1コマ(フレーム)を切り出し、画面上の矩形に合わせて拡大縮小・左右反転して描画する仕組みを実装します。2 / 4物理状態に基づくアニメーション制御プレイヤーの物理状態(接地フラグおよび速度ベクトル)に基づいて、待機・走行・上昇・落下の4状態を優先順位に従って判定し、適切なアニメーションコマを進行させる制御を実装します。3 / 4プレイヤーイベントによる演出の疎結合化プレイヤーの内部で成立した出来事(ジャンプや着地)を通知構造体(
PlayerEvents)として返し、キャラクターの物理運動ロジックとゲーム演出(音響やエフェクト)の依存関係を疎結合に保つ設計を実装します。4 / 4ジャンプと着地に音を付ける音声の読み込みを SoundManager へまとめ、発生したイベントに応じて音を再生します。動作確認
- 待機、走行、上昇、落下の各コマが正しく切り替わること
- 左右の進行方向に応じてスプライトが反転すること
- ジャンプ時と着地時の瞬間のみSEが1回再生されること
- BGMがループ再生されること
次回は、CSVファイルから敵キャラクターの出現位置を読み込み、複数の敵を管理・配置します。