ポリゴンの表示位置は、4つの頂点情報によって管理される。よって、ゲームループが回るたびにキャラクタを移動させるには、ループが回るたびに頂点情報を変化させればよい。
2Dゲームの場合、キャラクタの移動は横方向(X座標)と縦方向(Y座標)のみであるため、頂点情報のさまざまなメンバのうち、XとYの値を変化させればよい。
例えば、キャラクタを右に10ピクセル移動させるには、次のように行う。
TLVERTX VertexDataTbl1[0].x += 10.0f; TLVERTX VertexDataTbl1[1].x += 10.0f; TLVERTX VertexDataTbl1[2].x += 10.0f; TLVERTX VertexDataTbl1[3].x += 10.0f;
移動処理はゲームにおいて必要不可欠な処理であり、上記のやり方ではプログラミングにおいて非常に効率が悪い。よって、対象となる頂点情報とX/Y方向の移動量を与えて、各頂点に移動量を加える関数を用意したほうがよい。
例えば次のような関数を作成する(関数を作成したら、プロトタイプ宣言も行うこと)。
//----------------------------------------------------------------------------------------
// 関数名 : Move()
// 機能概要: 各頂点に対し、与えられた移動量を加算する
//----------------------------------------------------------------------------------------
void Move(LPTLVERTEX v, float x, float y)
{
int i;
for ( i=0 ; i<4 ; i++ ) {
v[i].x += x;
v[i].y += y;
}
}
移動処理関数を使って移動処理をプログラムすると、次のようになる。
//-----------------------------------------------------------------------------
// 関数名 : StartFrame()
// 機能概要: スタート画面処理
//-----------------------------------------------------------------------------
void StartFrame(void)
{
/* 描画処理 */
// キャラクタ1を描画
gl_lpD3ddev->SetTexture(0, gl_Texture1);
gl_lpD3ddev->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, VertexDataTbl1, sizeof(TLVERTX));
// キャラクタ2を描画
gl_lpD3ddev->SetTexture(0, gl_Texture2);
gl_lpD3ddev->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, VertexDataTbl2, sizeof(TLVERTX));
/* 移動処理 */
Move(VertexDataTbl1, 2.0f, 0.0f); // キャラクタ1を移動
// リターンキーが押されたら、ゲーム開始
if ( gl_KeyTbl[VK_RETURN] & 0x80 ) g_FrameNo = GAME_INIT;
}
※移動処理関数および移動処理を追加し、キャラクタが右に移動し続けることを確認する。
カーソルキーの状態に合わせてキャラクタを移動させるには、どのキーが押されているかを調べ、XYの移動量を増減させればよい。プログラムすると、次のようになる。
//-----------------------------------------------------------------------------
// 関数名 : StartFrame()
// 機能概要: スタート画面処理
//-----------------------------------------------------------------------------
void StartFrame(void)
{
float mx, my; // 移動量
/* 描画処理 */
// キャラクタ1を描画
gl_lpD3ddev->SetTexture(0, gl_Texture1);
gl_lpD3ddev->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, VertexDataTbl1, sizeof(TLVERTX));
// キャラクタ2を描画
gl_lpD3ddev->SetTexture(0, gl_Texture2);
gl_lpD3ddev->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, VertexDataTbl2, sizeof(TLVERTX));
/* 移動処理 */
// キャラクタ1の移動
mx = my = 0.0f;
if ( gl_KeyTbl[VK_LEFT] & 0x80 ) mx = -2.0f;
if ( gl_KeyTbl[VK_UP] & 0x80 ) my = -2.0f;
if ( gl_KeyTbl[VK_RIGHT] & 0x80 ) mx = 2.0f;
if ( gl_KeyTbl[VK_DOWN] & 0x80 ) my = 2.0f;
Move(VertexDataTbl1, mx, my);
// リターンキーが押されたら、ゲーム開始
if ( gl_KeyTbl[VK_RETURN] & 0x80 ) g_FrameNo = GAME_INIT;
}
※カーソルによる移動処理を追加し、キャラクタが自由に動くことを確認する。
| NEXT(画面をはみ出さないようにするには?) |