Skip to content

第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.cppSource/Platformer/SoundManager.h
既存ファイルへ追記・編集Source/Platformer/Game.cppSource/Platformer/Game.hSource/Platformer/Player.cppSource/Platformer/Player.hSource/Platformer/Tuning/GameTuning.h
重点的に実装・確認する処理Player::UpdateAnimation()Game::HandlePlayerEvents()

ヘッダーの宣言、include、画像などの登録表、読み込みのエラー処理は、最終ステップの参考実装を必要に応じて利用します。重点関数は各ステップで処理の理由を確かめながら記述します。関数を変更するときは、宣言・定義・呼び出し元の整合性を保ちます。

必要に応じて GameTuning.h に定数を追加し、アニメーション速度などの調整を行います。追加する音声素材は Assets/Sounds/ フォルダへ配置します。

第20回の目次

動作確認

  • 待機、走行、上昇、落下の各コマが正しく切り替わること
  • 左右の進行方向に応じてスプライトが反転すること
  • ジャンプ時と着地時の瞬間のみSEが1回再生されること
  • BGMがループ再生されること

次回は、CSVファイルから敵キャラクターの出現位置を読み込み、複数の敵を管理・配置します。

ゲームプログラミング実践