PDAのひとりごと

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

ポポペのプロ~10.得点をつけよう

2004-08-13 07:04:27 | Lesson
 ゲームなのだからスコアぐらい欲しいものですよね。最初からそのつもりで数字の絵も用意してあるのですから、早速スコアを付けましょう。
 まず変数です。スコアを保持するためにグローバル変数として 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;


 これでようやくスコア表示できるようになりました。スコアが表示されるとずいぶんゲームらしくなりますね。

最新の画像もっと見る

コメントを投稿