Skip to content
第01回 プレイヤーの表示と操作

3 / 4 プレイヤーの位置と表示の実装

このステップの目的

プレイヤー位置をリセットし、画像を描画する

画面座標と方向

プレイヤーを表示する前に、画面のどの位置に表示するかを決める必要があります。

数値の組み合わせで位置を指し示す表現を座標と呼びます。 通常、画面上の位置は横方向を指すX座標と、縦方向を指すY座標の組み合わせで表します。 ここでは画面の左上が{ 0, 0 }で、X座標は右へ進むほど、Y座標は下へ進むほど大きくなります。

画面座標の向き画面座標の向き

この座標を使って、プレイヤーを表示する位置と移動後の位置を表します。

プレイヤーの機能

Player.hには、プレイヤーの位置と処理が宣言されています。

Player.hcpp
class Player
{
public:
    void Reset();
    void Update(const Input& input, float deltaTime);
    void Draw(const ImageManager& images) const;
    Rect GetDrawRect() const;

private:
    Vector2 position = {};
};

positionはプレイヤーの中心座標です。 Vector2はX座標とY座標を1つにまとめて扱うための型で、つまりpositionには、プレイヤー中心のX座標とY座標が保存されます。

Vector2.hcpp
// 2D空間の位置や移動方向をX成分とY成分で表す
struct Vector2
{
    float x = 0.0f;
    float y = 0.0f;
};

privateは、プレイヤーの位置をPlayerクラスの内部で管理することを指定するアクセス指定子です。 これでプレイヤーの位置を操作するのはPlayerクラスの責任となり、また他のクラスからは勝手にプレイヤーの位置を操作される危険を防ぐことができます。

ここでのC++補足は、まずゲームを動かすことを優先する場合は読み飛ばして構いません。 privateの役割は「位置をPlayerの内部で管理する」とだけ覚え、後で必要になったときに戻って確認します。

INFO

C++では、クラスclassのメンバーは標準でprivateです。
一方、構造体structは標準でpublicです。

構造体はC++の前身にあたるC言語(正確にはC with Classes)から引き継がれたもので、互換性を考慮してpublicが標準となっています。
structclassはデフォルトのアクセス指定が異なるだけで、機能の差はありません。

プレイヤーの位置をリセットする

プロジェクト配布の時点では、Playerクラスの内部は部分的にしか実装されていません。 これから各機能を実装し、Playerクラスを動作するものに改造していきます。

まず、開始コードのPlayer::Reset()を、次のコードへ置き換えてください。

Player.cppcpp
void Player::Reset()
{
    position = tuning::player::StartPosition;
}

これでPlayer::Reset()はプレイヤーの座標を開始位置にリセットできるようになりました。

スコープ解決演算子

Player::Reset()のようにクラス名Playerとメンバー関数Reset()の間に挟まっている::はスコープ解決演算子です。 変数や関数、クラス、名前空間がどこに所属しているかを指定し、あいまいさを解決するために使用します。

なお開始位置はGameTuning.hに定義されています。

GameTuning.hcpp
inline constexpr Vector2 StartPosition = { 320.0f, 424.0f };

画面の横幅は640なので、X座標320は横方向の中央です。 Y座標424は、画面下側に置くプレイヤーの中心位置を表しています。

ImageManagerに描画を依頼する

開始コードのPlayer::Draw()全体を、次のコードへ置き換えます。

Player.cppcpp
void Player::Draw(const ImageManager& images) const
{
    Rect drawRect = GetDrawRect();
    images.Draw(ImageManager::Id::Player, drawRect);
}

ImageManager::Id::Playerは、読み込み済みのプレイヤー画像を指定する名前です。Playerは画像ハンドルやファイルパスを持たず、どの画像をどの矩形へ描くかだけをImageManagerへ伝えます。

GetDrawRect()は開始コードに実装済みです。現在のpositionを中心として、画像を描く範囲を返します。

表示座標の計算

GameTuning.hDrawRectは、プレイヤーの中心を基準にした表示範囲です。

GameTuning.hcpp
// プレイヤー中心を基準にした画像の表示範囲
inline constexpr Rect DrawRect = Rect::Centered(48.0f, 58.0f).MovedBy({ 0.0f, 3.0f });

横幅48縦幅58の画像を表示するという意味で範囲を定義しています。 また、画像の中心から下方向に3ずらした位置を表示の際の座標として扱います。

DXライブラリの標準の画像描画は左上座標を基準にしていますが、ゲームでは扱いづらいため座標の加工が必要になります。 Player::GetDrawRect()は、この描画範囲を現在のposition分だけ移動させることで実際の描画座標をと範囲を求める関数です。

Player.cppcpp
Rect Player::GetDrawRect() const
{
    return tuning::player::DrawRect.MovedBy(position);
}

これらの計算はやや繁雑なため、配布プロジェクトでは実装済みとしています。
中心座標、表示矩形、命中矩形の関係は、命中判定を実装する回で詳しく扱います。

ここまで実装してビルドすると、画面下部にプレイヤー画像が表示されます。

表示されたプレイヤー画像表示されたプレイヤー画像

チェックリスト
  • 画面下部にプレイヤー画像が表示されている