(1回分抜けていたため、番号がずれてしまいました。修正も含めて過去の分はこちらにあります→めざせ!ポポペのプロ)
今度はインベーダー側の攻撃です。基本は砲台の時と同じで、移動方向が逆になります。
まず、インベーダーの弾の位置を示す変数を作ります。場所は posTamaHou を定義した下で良いでしょう。
インベーダーの弾は、勝手に発射されます。処理のタイミングは、WM_CREATEが通知された時です。ここでは、弾が1発だけと決めているので、1つの弾が消えたら次の弾を出すようにしますが、それは別の処理になります。
弾が移動する処理は、定期的に実行しなければなりません。タイミング的には砲台の弾と同じで良いでしょう。WM_TIMER通知処理の中です。
インベーダーの弾の移動方向は、砲台の弾と逆になります。
これでインベーダーの弾が移動するようになりました。ビルドして実行してみましょう。
発射された弾は勝手に下へ飛んでいき、下端で消えます。まだ当たり判定を入れていないため、砲台に当たっても何も起こりません。
今度はインベーダー側の攻撃です。基本は砲台の時と同じで、移動方向が逆になります。
まず、インベーダーの弾の位置を示す変数を作ります。場所は 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 ); // そのまま転送 }
これでインベーダーの弾が移動するようになりました。ビルドして実行してみましょう。
発射された弾は勝手に下へ飛んでいき、下端で消えます。まだ当たり判定を入れていないため、砲台に当たっても何も起こりません。
※コメント投稿者のブログIDはブログ作成者のみに通知されます