かつどんの活動記録#4-1 2Dゲームカメラの作成
お久しぶりです。
最近学校に引き籠もっている時間が長いため、1週間ぶりの更新です。
今回の記事では自分の制作しているゲームに実装したものを紹介します。
◆カメラの改善
<camera.h>
class CAMERA
{
public:
void Update(void);
RECTANGLE* Camera_GetRectangleCollision();
bool InCamera(const RECTANGLE* pA);
CAMERA* Camera_GetPointer(void);
VECTOR2 Pos; // 左上座標(本当はprivateにするべき)
private:
VECTOR2 centerPos; // 中心座標
VECTOR2 Size; // 幅と高さ
};
<camera.cpp>
CAMERA g_camera;
RECTANGLE r_camera; // 矩形判定のための変数
/* カメラのアップデード関数 */
void CAMERA::Update(void)
{
g_camera.centerPos.x = Player_GetPointer()->centerPos.x;
g_camera.centerPos.y = Player_GetPointer()->centerPos.y;
g_camera.Pos.x = g_camera.centerPos.x - SCREEN_WIDTH * 0.5;
g_camera.Pos.y = g_camera.centerPos.y - SCREEN_HEIGHT * 0.5;
}
/* カメラの矩形判定を取得する関数 */
RECTANGLE* CAMERA::Camera_GetRectangleCollision()
{
r_camera.Pos.x = g_camera.Pos.x;
r_camera.Pos.y = g_camera.Pos.y;
r_camera.Size.x = SCREEN_WIDTH;
r_camera.Size.y = SCREEN_HEIGHT;
return &r_camera;
}
/* カメラの中に入っているかどうかを判別する関数 */
bool CAMERA::InCamera(const RECTANGLE* pA)
{
return Collision_IsHitRectangle(Camera_GetRectangleCollision(), pA); // カメラの範囲内に入ってるかどうかを調べる
}
/* カメラのポインタを取得する関数 */
CAMERA* CAMERA::Camera_GetPointer(void)
{
return &g_camera;
}
1つ前に紹介したカメラは”プレイヤーが画面の中心から移動する時に、その移動量分プレーヤー以外の座標を動かす”というものでした。ただ、これをすると当たり判定がガバガバになってしまうという問題がありました。
なので、新しく”スクリーンの大きさをカメラの範囲とし、それに触れていれば実際のオブジェクトの座標 - カメラの移動距離の位置に表示する”というカメラを作りました。
要約すると、実際にオブジェクトのある座標と表示させる座標を分けるということですね。自分ではこの仕組を思いつくことができず、友人から教えてもらった時は正直感動しました。
改善の箇所として、今はプレイヤーを中心に捉えているだけなので、そこをボスや部屋の中心を捉えられるように汎用性を持たせることと、描画する瞬間にプレイヤーやエネミーの実際の座標からそれぞれ引いているので、そいつらに表示座標的な変数をもたせてカメラ内で一括で更新できるようにすることの2つは考えています。