PDAのひとりごと

黄昏時、携帯情報端末は薄闇の向こうに何を見るのか

ポポペのプロ~8.爆撃

2004-08-01 17:48:43 | Lesson
(1回分抜けていたため、番号がずれてしまいました。修正も含めて過去の分はこちらにあります→めざせ!ポポペのプロ

 今度はインベーダー側の攻撃です。基本は砲台の時と同じで、移動方向が逆になります。
 まず、インベーダーの弾の位置を示す変数を作ります。場所は posTamaHou を定義した下で良いでしょう。

POINT posTamaInv;


 インベーダーの弾は、勝手に発射されます。処理のタイミングは、WM_CREATEが通知された時です。ここでは、弾が1発だけと決めているので、1つの弾が消えたら次の弾を出すようにしますが、それは別の処理になります。

posTamaInv.x = posInv.x;
posTamaInv.y = posInv.y + 24;
BitBlt( hdcScreen,		// 転送先HDC
        posTamaHou.x,	// 表示位置 X座標
        posTamaHou.y,	// 表示位置 Y座標
        32,		// 表示サイズ 幅
        24,		// 表示サイズ 高さ
        hdcBmp,		// 転送元HDC
        0,		// 転送元 X座標
        0,		// 転送元 Y座標
        SRCCOPY );	// そのまま転送


 弾が移動する処理は、定期的に実行しなければなりません。タイミング的には砲台の弾と同じで良いでしょう。WM_TIMER通知処理の中です。

case WM_TIMER:
    GmMoveInv();
    GmMoveTamaInv();
    GmMoveTamaHou();
    GmMoveHou();
    InvalidateRect(hWnd, NULL, FALSE);
    break;


 インベーダーの弾の移動方向は、砲台の弾と逆になります。

void GmMoveTamaInv(void)
{
    PatBlt( hdcScreen, 		// 対象のHDC
            posTamaInv.x,		// 表示位置 X座標
            posTamaInv.y,		// 表示位置 Y座標
            32,			// 表示サイズ 幅
            24,			// 表示サイズ 高さ
            WHITENESS );		// 白で塗りつぶす

    posTamaInv.y += 24;		// 下へ落ちる

    if (posTamaInv.y >= 320-1-24) {	// 下端を越えた時
        posTamaInv.x = posInv.x;	// 表示終了
        posTamaInv.y = posInv.y + 24;
    }

    BitBlt( hdcScreen,		// 転送先HDC
            posTamaInv.x,		// 表示位置 X座標
            posTamaInv.y,		// 表示位置 Y座標
            32,			// 表示サイズ 幅
            24,			// 表示サイズ 高さ
            hdcBmp,			// 転送元HDC
            96,			// 転送元 X座標
            24,			// 転送元 Y座標
            SRCCOPY );		// そのまま転送
}


 これでインベーダーの弾が移動するようになりました。ビルドして実行してみましょう。
 発射された弾は勝手に下へ飛んでいき、下端で消えます。まだ当たり判定を入れていないため、砲台に当たっても何も起こりません。

最新の画像もっと見る

コメントを投稿