5

win32 GDI のようなゲームマリオを作成しています。game の新しいループを実装しました:

PeekMessage(&msg,NULL,0,0,PM_NOREMOVE);

while (msg.message!=WM_QUIT)
{
    if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    else // No message to do
    {
        gGameMain->GameLoop();  
    }
}

しかし、私のゲームは Ctrl + Alt + Del を押すまで実行されています (マウスカーソルが回転しています)。

4

3 に答える 3

6

私はいつもそのようなものを使ってきました:

    MSG msg;
    while (running){
        if (PeekMessage(&msg, hWnd, 0, 0, PM_REMOVE)){
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        else
            try{
                onIdle();
            }
            catch(std::exception& e){
                onError(e.what());
                close();
            }
    }

onIdle は実際のゲームの lopp 実装であり、onError() はエラー ハンドラー (引数としてエラーの説明を受け取る) であり、「running」はグローバル bool 変数またはクラス メンバーのいずれかです。"running" を false に設定すると、ゲームがシャットダウンします。

于 2010-05-12T10:33:58.517 に答える
5

これは本当にあなたの文脈に依存すると思います。Windowsは、PostQuitMessageを呼び出すアプリケーションに応答してのみWM_QUITを送信します。ここでの一般的な(素晴らしいとは言えない)解決策は、プログラムを終了したいときにブール値を使用してメッセージループを終了することです。

于 2010-05-12T08:52:51.483 に答える
2

GameLoop 関数呼び出し内で、プログラムがユーザーに続行または終了を要求する可能性があると思います。終了時 WM_QUIT メッセージをウィンドウに投稿します。

PostMessage(hWnd, WM_QUIT, 0, 0 );

hWnd-> ゲーム ウィンドウのハンドル

そうでなければ電話をかける

DestroyWindow(hWnd);

これにより、ウィンドウ プロシージャに WM_DESTROY が送信されます。そこにあなたが呼び出すことができます

PostQuitMessage(0);     
于 2010-05-12T11:22:58.957 に答える