Appearance
第14回 調整できるプレイヤー表示と操作
1 / 4 座標型と中心基準の矩形計算
このステップの目的
2次元座標を表す Vector2 と矩形領域を表す Rect を用い、キャラクターの中心点を基準とした表示矩形および当たり判定矩形の算出方法を理解します。
2軸をまとめる Vector2 構造体
ゲーム内の位置や速度は、X軸(横方向)とY軸(縦方向)の2つの実数値で表現されます。これらを個別の変数として引き回すのではなく、Vector2 構造体にまとめます。
Vector2.hcpp
namespace dxgame
{
struct Vector2
{
float x = 0.0f;
float y = 0.0f;
};
}位置を1つの構造体として扱うことで、関数の引数渡しや座標の加算・減算が簡潔に記述できるようになります。
Rect の定義と中心基準(Centered)の生成
矩形を表す Rect は、左上のX・Y座標と、幅(width)、高さ(height)の4つのパラメータで構成されます。
アクションゲームでは、キャラクターの現在位置 position を「左上角」ではなく「キャラクターの中心点(または足元)」として扱うのが一般的です。左右の反転描画やサイズ変更を行う際に、左上角を基準にしていると表示位置にズレが生じやすいためです。
そこで、中心座標を原点(0, 0)とした相対矩形を生成する静的メンバ関数 Centered() と、指定オフセット分平行移動させる MovedBy() を用意します。
Rect.hcpp
namespace dxgame
{
struct Rect
{
float x = 0.0f;
float y = 0.0f;
float width = 0.0f;
float height = 0.0f;
// 指定された幅と高さを持ち、中心が (0, 0) になる矩形を生成する
static constexpr Rect Centered(float width, float height)
{
return { -width * 0.5f, -height * 0.5f, width, height };
}
// 指定された移動量(offset)分だけ平行移動した新しい矩形を返す
constexpr Rect MovedBy(const Vector2& offset) const
{
return { x + offset.x, y + offset.y, width, height };
}
};
}中心点からワールド上の絶対矩形を求める仕組み
Rect::Centered(32.0f, 48.0f) を実行すると、左上座標が (-16.0f, -24.0f)、幅が 32.0f、高さが 48.0f の相対矩形が作られます。
この相対矩形に対して、プレイヤーの現在位置 position_(例えば { 320.0f, 240.0f })を MovedBy() で加算すると、次のようになります。
$$\text{左上X} = -16.0 + 320.0 = 304.0$$
$$\text{左上Y} = -24.0 + 240.0 = 216.0$$
このように中心を (0, 0) とした相対定義を保持しておくことで、プレイヤーが移動しても、MovedBy(position_) を呼び出すだけで正しい絶対矩形を算出できます。
チェックリスト
-
Vector2がX座標とY座標をひとまとめに管理していることを理解している - キャラクターの位置を中心点基準で扱う理由(反転やサイズ変更時のズレ防止)を説明できる
-
Rect::Centered()が中心原点の相対矩形を生成する仕組みを説明できる - 相対矩形へ
position_を加算して絶対位置の矩形を生成できる