このゲームループを作成するより良い方法はありますか? (C ++ / Windows)

StackOverflow https://stackoverflow.com/questions/1800250

質問

Windowsゲームに取り組んでいますが、これがあります:

bool game_cont;

LRESULT WINAPI WinProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
    case WM_QUIT: case WM_CLOSE: case WM_DESTROY: game_cont = false; break;
    }
    return DefWindowProc(hWnd, msg, wParam, lParam);
}

int WINAPI WinMain(/*lots of parameters*/)
{
    //tedious initialization

    //game loop
    while(game_cont)
    {
        //give message to WinProc
        if(!GameRun()) game_cont = false;
    }
    return 0;
}

そして game_cont をグローバルにするよりも、これを行うためのより良い方法があるかどうか(今のところタイマー& cを無視して)疑問に思っています。要するに、 WinProc から WinMain でwhileを終了できるようにする必要があります。これにより、ユーザーがゲームの終了以外の方法でゲームの終了ボタンを押した場合ゲームメニューでは、プログラムはメモリ内で実行され続けません。 ( WinProc game_cont .. ステートメントなしでこれをテストしたときのように。

ああ、補足的に、 GameRun は基本的にブール値で、ゲームが終了するとfalseを返し、そうでない場合はtrueを返します。

役に立ちましたか?

解決

はい、 PeekMessage を使用します。ゲーム開発の標準。

これが最良のアプローチです。

int Run()
{
    MSG msg;
    while(true)
    {
        if(::PeekMessage(&msg,0,0,0 PM_REMOVE))
        {
            if(msg.message == WM_QUIT || 
                       msg.message == WM_CLOSE || 
                       msg.message == WM_DESTROY)
                break;

            ::TranslateMessage(&msg);
            ::DispatchMessage(&msg);           
        }
        else
        {
            //Run game code
                    if(!GameRun())
                         break;
        }
    }
} 

また、これ(特に最初の回答)をご覧ください

他のヒント

exit を使用できます。 atexit を使用して、WM_CLOSEが確実に取得されるようにします。終了するときのメッセージキューへ。

ここでの究極のデザインはわかりませんが、それはアイデアです。

WinMain / WinProc を持つメインファイルに対して game_cont static を作成できますが、構造が大幅に改善されていることを知っている。

いいえ、それをしないでください。

WM_QUIT はフラグです。 GetMessage の戻り値は、 WM_QUIT が検出されたときを示します。

ウィンドウに送信されないため、メインウィンドウは WM_QUIT を受信しません。 WM_CLOSE はデフォルトで DestroyWindow を呼び出すため、特別な処理は必要ありません。 PostQuitMessage を呼び出して WM_DESTROY を処理します。これにより、スレッドで WM_QUIT が生成され、 GetMessage からの特別な戻り値が生成されます。メッセージディスパッチループを停止します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top