Skip to content
第16回 ワールド座標とカメラ

3 / 4 描画する位置を画面座標へ変換する

このステップの目的

ワールド座標を保ちながら、描くときにカメラ位置を引きます。

矩形を画面座標へ変換する

Camera::WorldToScreenはX座標からカメラ位置を引きます。Y座標と幅・高さは変えません。

Camera.cppcpp
dxgame::Vector2 Camera::WorldToScreen(const dxgame::Vector2& world) const
{
    return { world.x - static_cast<float>(x_), world.y };
}

プレイヤーと地形へ適用する

Player.hDraw() の宣言へ Camera を追加し、定義と引数順をそろえます。

Player.cppcpp
void Player::Draw(const Camera& camera, const ImageManager& images) const
{
    images.Draw(ImageId::Player,
        camera.WorldToScreen(GetDrawRect()));
}

Stage::Draw() にはカメラのX座標を渡します。Stage はタイル位置とゴール位置から cameraX を引きます。プレイヤーも地形も、元のワールド座標を書き換えない点は共通です。

Game.cppcpp
void Game::Draw() const
{
    DrawBackground();
    stage_.Draw(camera_.GetX(), images_);
    player_.Draw(camera_, images_);
    DrawHud();
    DrawDebug();
}

背景と操作案内は画面に固定します。背景にカメラ位置を引くと画面の端に空白が出るため、背景は DrawBackground() で画面全体へ描きます。

チェックリスト
  • プレイヤー・地形・ゴールの位置関係がスクロール中も保たれる
  • 背景と操作案内は画面に固定される
  • PlayerDraw()CameraImageManager の順に受け取る

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