ここまでで、自分の好きな画像を好きな位置に描画し、画面に表示できるようになった。プログラムの流れは次のとおりである。
- 背景の描画(バック・サーフェイスのクリア)
- キャラクタの描画
- フリップ処理(サーフェイスの切り替え)
- 1に戻る(ゲーム・ループ)
では、キャラクタを上下左右に動かすにはどうすればよいだろうか?
描画処理は、描画したい画像の矩形をバック・サーフェイスの指定した位置に転送することで行われている。であれば、1に戻る前に描画位置を変更してやればよいことが分かる。具体的には次のようにプログラムを修正する。
- 背景の描画(バック・サーフェイスのクリア)
- キャラクタの描画
- キャラクタ表示位置の移動
- フリップ処理(サーフェイスの切り替え)
- 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;