Gibt es einen besseren Weg, um erstellen Sie dieses Spiel Schleife?(C++/Windows)
-
05-07-2019 - |
Frage
Ich arbeite an einer Windows-Spiel, und ich habe dies:
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;
}
und ich Frage mich, ob es einen besseren Weg gibt, dies zu tun (ignorieren timers &c.für jetzt), als game_cont
global sein.Kurz gesagt, ich muss in der Lage sein, zu verlassen, während in WinMain
von WinProc
, so dass, wenn der Benutzer drückt, schließt sich das Spiel in einem anderen Weg, dass das Spiel im Spiel-Menü, das Programm wird nicht weiter laufen Speicher.(Wie damals, als ich getestet, ohne game_cont..
Anweisung WinProc
.
Oh, und auf einer Seite zur Kenntnis, GameRun
im Grunde ist ein bool, das false zurückgibt, wenn das Spiel endet, und andernfalls true.
Lösung
Ja, verwenden Sie PeekMessage, es ist die standard in die Spiele-Entwicklung.
Dies ist der beste Ansatz, glaube ich, dass:
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;
}
}
}
Betrachten Sie auch diese (speziell die erste Antwort)
Andere Tipps
Sie machen könnten game_cont
static
zu Ihren Haupt-Datei, die hat WinMain
/WinProc
, aber ich weiß nicht, der eine deutlich bessere Struktur.
Nein, das nicht.
WM_QUIT
ist Ihre Flagge. GetMessage
Rückgabewert zeigt an, Wann WM_QUIT
aufgetreten ist.
Ihre Haupt-Fenster nie erhalten WM_QUIT
,, da es nicht an ein Fenster gesendet. WM_CLOSE
rufen DestroyWindow
standardmäßig, so dass Sie brauchen keine Besondere Behandlung, für, dass.Griff WM_DESTROY
durch den Aufruf PostQuitMessage
, die Ergebnisse in WM_QUIT
auf dein thread, den speziellen Rückgabewert GetMessage
, und hält Ihre Nachricht Versand-Schleife.