このゲームループを作成するより良い方法はありますか? (C ++ / Windows)
-
05-07-2019 - |
質問
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;
}
}
}
また、これ(特に最初の回答)をご覧ください
他のヒント
WinMain
/ WinProc
を持つメインファイルに対して game_cont
static
を作成できますが、構造が大幅に改善されていることを知っている。
いいえ、それをしないでください。
WM_QUIT
はフラグです。 GetMessage
の戻り値は、 WM_QUIT
が検出されたときを示します。
ウィンドウに送信されないため、メインウィンドウは WM_QUIT
を受信しません。 WM_CLOSE
はデフォルトで DestroyWindow
を呼び出すため、特別な処理は必要ありません。 PostQuitMessage
を呼び出して WM_DESTROY
を処理します。これにより、スレッドで WM_QUIT
が生成され、 GetMessage
からの特別な戻り値が生成されます。メッセージディスパッチループを停止します。