Appearance
第16回 ワールド座標とカメラ
第16回では、画面解像度(640×480)を超える横長のステージに対応するための「ワールド座標系とカメラ(Camera)」を導入します。
ゲーム世界全体の絶対的な位置関係(ワールド座標)を保ったまま、プレイヤーの移動に合わせて視界を横スクロールさせ、画面外の不要なタイル描画をスキップするカリング(描画最適化)を学びます。
配布プロジェクト
第16回の開始用プロジェクトを展開し、PlatformerGame2D.sln を Visual Studio 2026 で開いてください。
横に長く伸びた初期ステージ Assets/Maps/Stage01.csv と、カメラクラス Camera の基本宣言が用意されています。
配布ファイル一覧
| ファイル | 役割 |
|---|---|
Source/Platformer/Stage.cpp | カメラ位置に応じた画面内タイルの限定描画(カリング) |
Source/Platformer/Player.cpp | 画面端制限を解除し、ステージ内を移動 |
Source/Platformer/Game.cpp | 毎フレームのカメラ追従呼び出しと各描画へのカメラ渡し |
この回のゴール
プレイヤーが右方向へ移動すると、画面中央付近にプレイヤーを保ったまま地形が左方向へスクロールします。第13回から表示している背景画像はスクリーン座標へ固定します。
ステージの左端(開始点)や右端(ゴール地点)では、ステージ外の余白が映り込まないようにカメラが停止することを確認します。
- 「ワールド座標系」と「スクリーン座標系(画面座標系)」の役割の違いを説明できる
- 衝突判定や物理計算には常にワールド座標を使用し、描画の段階でのみカメラ変換を行う理由を理解できる
- プレイヤーを中心にとらえ、ステージ両端でクランプする追従カメラを実装できる
- 画面内に入っているタイルの列範囲(
firstX〜lastX)を計算し、画面外の描画をスキップできる
今回のポイント
移動・判定の「ワールド座標」と、描画の「画面座標」の分離
ゲームプログラムにおいて重要な原則は、「物体の更新や当たり判定に、カメラの都合(画面座標)を持ち込まない」 という点です。
ワールド座標更新
物理や衝突判定完了後にCamera::WorldToScreen()を適用
画面座標変換
画面座標変換
ウィンドウ左上(0, 0)を原点とする描画関数に渡して表示
画面描画
プレイヤーの座標そのものをカメラの動きに合わせて書き換えてしまうと、画面振動(シェイク演出)などを追加した際に衝突判定の位置までずれる原因になります。更新と描画の境界を明確に保つことが設計上の重要な原則です。
作業の準備
開始用ZIPには前回までの到達状態が含まれています。今回の新規ファイルは、本文を進めながら追加します。ファイルの登録方法や変更の引き継ぎ手順は、配布ファイルの手順で確認できます。
| 作業 | 対象 |
|---|---|
| 新規作成 | Source/Platformer/Camera.cpp、Source/Platformer/Camera.h |
| 既存ファイルへ追記・編集 | Source/Platformer/Game.cpp、Source/Platformer/Game.h、Source/Platformer/Player.cpp、Source/Platformer/Player.h、Source/Platformer/Stage.cpp、Source/Platformer/Stage.h、Source/Platformer/Tuning/GameTuning.h |
| 重点的に実装・確認する処理 | Camera::Update、Camera::WorldToScreen、Stage::Draw |
ヘッダーの宣言、#include、登録テーブル、エラー処理などは、最終ステップの参考実装を参照できます。重点関数は各ステップで処理の流れを確認しながら記述します。関数を変更する際は、宣言・定義・呼び出し元の整合性を保ちます。
GameTuning.h には今回必要な定数を追記し、自身で調整した既存の値を維持します。
授業の進め方
1 / 4ワールド座標を描画から分離するゲーム世界全体の絶対的な位置を表す「ワールド座標系」と、現在のディスプレイ表示枠を表す「スクリーン座標系」の違いを理解します。2 / 4プレイヤーへ追従するCameraを作るプレイヤーを画面の中央付近にとらえ続けるカメラ座標の計算方法と、ステージ外側の余白を映さない境界制限(クランプ)を実装します。3 / 4描画する位置を画面座標へ変換するワールド座標を保ちながら、描くときにカメラ位置を引きます。4 / 4画面に見えるタイルだけ描画する現在のカメラ位置から「画面内に見えているタイルの列範囲」を計算し、画面外にあるタイルの描画をスキップするカリング処理を実装します。
動作確認
- プレイヤーのワールドX座標は進行方向へ正しく加算される
- 描画位置だけがカメラX座標の分だけオフセットして描画される
- カメラがステージの外側へはみ出さずに停止する
- 画面外のタイルが描画対象から除外(カリング)されている