Skip to content

第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回から表示している背景画像はスクリーン座標へ固定します。
ステージの左端(開始点)や右端(ゴール地点)では、ステージ外の余白が映り込まないようにカメラが停止することを確認します。

  • 「ワールド座標系」と「スクリーン座標系(画面座標系)」の役割の違いを説明できる
  • 衝突判定や物理計算には常にワールド座標を使用し、描画の段階でのみカメラ変換を行う理由を理解できる
  • プレイヤーを中心にとらえ、ステージ両端でクランプする追従カメラを実装できる
  • 画面内に入っているタイルの列範囲(firstXlastX)を計算し、画面外の描画をスキップできる

今回のポイント

移動・判定の「ワールド座標」と、描画の「画面座標」の分離

ゲームプログラムにおいて重要な原則は、「物体の更新や当たり判定に、カメラの都合(画面座標)を持ち込まない」 という点です。

2つの座標系の役割分離
ワールド座標更新
物理や衝突判定完了後にCamera::WorldToScreen()を適用
画面座標変換
画面座標変換
ウィンドウ左上(0, 0)を原点とする描画関数に渡して表示
画面描画

プレイヤーの座標そのものをカメラの動きに合わせて書き換えてしまうと、画面振動(シェイク演出)などを追加した際に衝突判定の位置までずれる原因になります。更新と描画の境界を明確に保つことが設計上の重要な原則です。

作業の準備

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

作業対象
新規作成Source/Platformer/Camera.cppSource/Platformer/Camera.h
既存ファイルへ追記・編集Source/Platformer/Game.cppSource/Platformer/Game.hSource/Platformer/Player.cppSource/Platformer/Player.hSource/Platformer/Stage.cppSource/Platformer/Stage.hSource/Platformer/Tuning/GameTuning.h
重点的に実装・確認する処理Camera::UpdateCamera::WorldToScreenStage::Draw

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

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

授業の進め方

動作確認

  • プレイヤーのワールドX座標は進行方向へ正しく加算される
  • 描画位置だけがカメラX座標の分だけオフセットして描画される
  • カメラがステージの外側へはみ出さずに停止する
  • 画面外のタイルが描画対象から除外(カリング)されている

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