Appearance
第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.h の Draw() の宣言へ 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() で画面全体へ描きます。
チェックリスト
- プレイヤー・地形・ゴールの位置関係がスクロール中も保たれる
- 背景と操作案内は画面に固定される
-
PlayerのDraw()はCamera、ImageManagerの順に受け取る