まず、前回の続きで、移動後のインベーダーの消去をから始めます。
インベーダーが移動せずに増殖してしまったのは、移動前のキャラクタを消さなかったためです。
通常のゲームでは背景があるので消すための処理に工夫がいりますが、今回のプログラムではバックが白1色なので、塗りつぶすだけで消去したことになります。
インベーダー移動処理の最初に消去する処理を加えます。
void GmMoveInv(void)
{
PatBlt( hdcScreen, // 対象のHDC
posInv.x, // 表示位置 X座標
posInv.y, // 表示位置 Y座標
32, // 表示サイズ 幅
24, // 表示サイズ 高さ
WHITENESS ); // 白で塗りつぶす
移動速度に関しては、タイマそのもののインターバルを長くすることも考えられますが、速度を可変にしたいため、カウンタを設けて時間を調整することとします。
まず、カウンタを作ります。場所は、ファイルの先頭部分、グローバル変数の宣言が並んでいる所で良いでしょう。
int iInvTime; // 移動タイミングカウンタ
次に、カウンタを初期化します。初期化はプログラムの最初に1度行えばよいので、WM_CREATEが通知されたときとします。
iInvTime = 0;
タイマを数えて、1秒経ったらインベーダーが移動するようにします。タイマを200mSに設定しているので、WM_TIMERが5回通知されると1秒になります。その処理をGmMoveInv関数の先頭に追加します。
iInvTime++;
if (iInvTime < 5) {
return;
}
iInvTime = 0;
ここまで追加したら、ビルドしてみましょう。今度の動きはいかがでしょうか?インベーダーが右から左へ動いて見えますね。移動量が1キャラクタ分のためカクカクした動きに見えるかもしれませんが、それは移動量を少なくすることによって解消できます。しかし、ここでは以降のプログラムの都合上そのままにしておきます。
インベーダーが移動せずに増殖してしまったのは、移動前のキャラクタを消さなかったためです。
通常のゲームでは背景があるので消すための処理に工夫がいりますが、今回のプログラムではバックが白1色なので、塗りつぶすだけで消去したことになります。
インベーダー移動処理の最初に消去する処理を加えます。
void GmMoveInv(void)
{
PatBlt( hdcScreen, // 対象のHDC
posInv.x, // 表示位置 X座標
posInv.y, // 表示位置 Y座標
32, // 表示サイズ 幅
24, // 表示サイズ 高さ
WHITENESS ); // 白で塗りつぶす
移動速度に関しては、タイマそのもののインターバルを長くすることも考えられますが、速度を可変にしたいため、カウンタを設けて時間を調整することとします。
まず、カウンタを作ります。場所は、ファイルの先頭部分、グローバル変数の宣言が並んでいる所で良いでしょう。
int iInvTime; // 移動タイミングカウンタ
次に、カウンタを初期化します。初期化はプログラムの最初に1度行えばよいので、WM_CREATEが通知されたときとします。
iInvTime = 0;
タイマを数えて、1秒経ったらインベーダーが移動するようにします。タイマを200mSに設定しているので、WM_TIMERが5回通知されると1秒になります。その処理をGmMoveInv関数の先頭に追加します。
iInvTime++;
if (iInvTime < 5) {
return;
}
iInvTime = 0;
ここまで追加したら、ビルドしてみましょう。今度の動きはいかがでしょうか?インベーダーが右から左へ動いて見えますね。移動量が1キャラクタ分のためカクカクした動きに見えるかもしれませんが、それは移動量を少なくすることによって解消できます。しかし、ここでは以降のプログラムの都合上そのままにしておきます。
※コメント投稿者のブログIDはブログ作成者のみに通知されます