第3章 画像の表示・動作

3-4 キャラクタの移動

ここまでで、自分の好きな画像を好きな位置に描画し、画面に表示できるようになった。プログラムの流れは次のとおりである。

  1. 背景の描画(バック・サーフェイスのクリア)
  2. キャラクタの描画
  3. フリップ処理(サーフェイスの切り替え)
  4. 1に戻る(ゲーム・ループ)

では、キャラクタを上下左右に動かすにはどうすればよいだろうか?
描画処理は、描画したい画像の矩形をバック・サーフェイスの指定した位置に転送することで行われている。であれば、1に戻る前に描画位置を変更してやればよいことが分かる。具体的には次のようにプログラムを修正する。

  1. 背景の描画(バック・サーフェイスのクリア)
  2. キャラクタの描画
  3. キャラクタ表示位置の移動
  4. フリップ処理(サーフェイスの切り替え)
  5. 1に戻る

画像の表示はDirectDrawのBltFast関数を利用する。

hRet = g_pDDSBack->BltFast(300, 230, g_pDDSGame, &AngelRect, DDBLTFAST_SRCCOLORKEY);

このプログラムでは、天使の画像をバック・サーフェイスの座標(300, 230)に転送している。つまり、表示座標を変数で持ち、変化させればキャラクタが動いているように見せることができる

《プログラム例》

// グローバル変数
RECT AngelRect;  // キャラクタの矩形
int x, y;  // キャラクタのx、y座標(いろんな関数で利用することを考え、グローバル変数として宣言)
int move_x, move_y;  // キャラクタの移動量
    ・
    ・
    ・

// ゲーム開始前初期化処理
void GameInit(void)
{
    // キャラクタ用各種変数初期化
    SetRect(&AngelRect, 0, 0, 48, 48);
    x = 300;
    y = 230;
    move_x = 4;
    move_y = 4;
    ・
    ・
    ・
}

// ゲームメイン処理
void GameFrame(void)
{
    ・
    ・
    ・
    // キャラクタを描画
    hRet = g_pDDSBack->BltFast((DWORD)x, (DWORD)y, g_pDDSGame, &AngelRect, DDBLTFAST_SRCCOLORKEY);
    ・
    ・
    ・
    // キャラクタ移動処理
    x += move_x;
    if (キャラクタの座標が画面をはみ出したら)
        x = 0;
    ・
    ・
    ・

《POINT》

この変化のさせ方をいろいろ工夫することにより、キャラクタが直線的に動いたり、ジャンプしたり自然落下したり、いろいろできる。

例)カーソルキーを押すと、キャラクタがそれぞれの方向に移動するプログラム

if (KeyTbl[VK_LEFT] & 0x80)
    x -= move_x;
if (KeyTbl[VK_RIGHT] & 0x80)
    x += move_x;
if (KeyTbl[VK_UP] & 0x80)
    y -= move_y;
if (KeyTbl[VK_DOWN] & 0x80)
    y += move_y;

[ TOP ] [ Next ]