移動処理

この章で使用するプログラムおよび画像ファイル

移動処理の考え方

ポリゴンの表示位置は、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;

《POINT》

移動処理用関数の作成

移動処理はゲームにおいて必要不可欠な処理であり、上記のやり方ではプログラミングにおいて非常に効率が悪い。よって、対象となる頂点情報と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;
    }
}

《POINT》

移動処理用関数の使い方

移動処理関数を使って移動処理をプログラムすると、次のようになる。

//-----------------------------------------------------------------------------
// 関数名 : 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;

}

《POINT》

※移動処理関数および移動処理を追加し、キャラクタが右に移動し続けることを確認する。

カーソルキーにあわせてキャラクタを移動させる

カーソルキーの状態に合わせてキャラクタを移動させるには、どのキーが押されているかを調べ、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;

}

《POINT》

※カーソルによる移動処理を追加し、キャラクタが自由に動くことを確認する。



NEXT(画面をはみ出さないようにするには?)