ゲームなのだからスコアぐらい欲しいものですよね。最初からそのつもりで数字の絵も用意してあるのですから、早速スコアを付けましょう。
まず変数です。スコアを保持するためにグローバル変数として iScore を作りましょう。
変数は初期化しなくてはなりません。例によって初期化はWM_CREATEが通知されたときの処理 DoCreateMain 関数の中になります。また、この時にスコアも表示してしまいます。スコア表示は少し手間がかかるので、関数にまとめてしまいましょう。GmDispScore関数がそれです。
スコアは、インベーダーを撃墜したときに増やします。つまり、砲台の弾の移動処理であるGmMoveTamaHou関数の中の当たり判定の中でカウントアップする事になります。
今回は、これ以外に得点追加となるものがないため、後は表示処理だけです。スコアは、下2桁だけ表示します。
これでスコアは表示されるのですが、今のままではコマンドバーに隠れて見えません。そこで、コマンドバーを表示しないようにしてしまいます。
まずは、DoWmCreateの最初の部分にある3行がコマンドバーを作成している部分なので、これをコメントアウトします。
次に、InitInstanceの最後の部分に、コマンドバーを表示する部分があるのでこれもコメントアウトします。
最後に、WndProcのWM_DESTROY通知の処理の中にコマンドバーを破棄する処理があるので、これを消して終わりです。
さて、これでコマンドバーが消えたのですが、今度はコマンドバーにあった「アプリケーションの終了」がなくなってしまいました。そこで、ESCキー(ポポペの「もどる」キー)で終了するように処理を追加します。
WndProcのWM_KEYDOWNの処理の中で、ESCキーを判定してプログラムを終了するようにします。
これでようやくスコア表示できるようになりました。スコアが表示されるとずいぶんゲームらしくなりますね。
まず変数です。スコアを保持するためにグローバル変数として iScore を作りましょう。
int iScore;
変数は初期化しなくてはなりません。例によって初期化はWM_CREATEが通知されたときの処理 DoCreateMain 関数の中になります。また、この時にスコアも表示してしまいます。スコア表示は少し手間がかかるので、関数にまとめてしまいましょう。GmDispScore関数がそれです。
iScore = 0; // スコア初期化 GmDispScore(); // スコア表示
スコアは、インベーダーを撃墜したときに増やします。つまり、砲台の弾の移動処理であるGmMoveTamaHou関数の中の当たり判定の中でカウントアップする事になります。
if ((posTamaHou.x == posInv.x) && (posTamaHou.y == posInv.y)) { PatBlt( hdcScreen, // 対象のHDC posTamaHou.x, // 表示位置 X座標 posTamaHou.y, // 表示位置 Y座標 32, // 表示サイズ 幅 24, // 表示サイズ 高さ WHITENESS ); // 白で塗りつぶす posInv.x = 320 - 32; posInv.y = 24; posTamaHou.x = -1; // 表示終了 iScore++; // スコア+1 GmDispScore(); // スコア表示 }
今回は、これ以外に得点追加となるものがないため、後は表示処理だけです。スコアは、下2桁だけ表示します。
void GmDispScore(void) { int a, b; a = iScore / 100; // 1234 / 100 = 12 b = iScore - a * 100; // 1234 - 12*100 = 34 a = b / 10; // 34 / 10 = 3 b -= a * 10; // 34 - 3*10 = 2 BitBlt( hdcScreen, // 転送先HDC 104, // 表示位置 X座標 0, // 表示位置 Y座標 16, // 表示サイズ 幅 24, // 表示サイズ 高さ hdcBmp, // 転送元HDC a*16, // 転送元 X座標 0, // 転送元 Y座標 SRCCOPY ); // そのまま転送 BitBlt( hdcScreen, // 転送先HDC 104+16, // 表示位置 X座標 0, // 表示位置 Y座標 16, // 表示サイズ 幅 24, // 表示サイズ 高さ hdcBmp, // 転送元HDC b*16, // 転送元 X座標 0, // 転送元 Y座標 SRCCOPY ); // そのまま転送 }
これでスコアは表示されるのですが、今のままではコマンドバーに隠れて見えません。そこで、コマンドバーを表示しないようにしてしまいます。
まずは、DoWmCreateの最初の部分にある3行がコマンドバーを作成している部分なので、これをコメントアウトします。
// hwndCB = CommandBar_Create(hInst, hWnd, 1); // CommandBar_InsertMenubar(hwndCB, hInst, IDM_MENU, 0); // CommandBar_AddAdornments(hwndCB, 0, 0);
次に、InitInstanceの最後の部分に、コマンドバーを表示する部分があるのでこれもコメントアウトします。
// if (hwndCB) // CommandBar_Show(hwndCB, TRUE);
最後に、WndProcのWM_DESTROY通知の処理の中にコマンドバーを破棄する処理があるので、これを消して終わりです。
// CommandBar_Destroy(hwndCB);
さて、これでコマンドバーが消えたのですが、今度はコマンドバーにあった「アプリケーションの終了」がなくなってしまいました。そこで、ESCキー(ポポペの「もどる」キー)で終了するように処理を追加します。
WndProcのWM_KEYDOWNの処理の中で、ESCキーを判定してプログラムを終了するようにします。
case WM_KEYDOWN: wKey = wParam; if (wParam == VK_ESCAPE) { DestroyWindow(hWnd); } break;
これでようやくスコア表示できるようになりました。スコアが表示されるとずいぶんゲームらしくなりますね。
※コメント投稿者のブログIDはブログ作成者のみに通知されます