Existe-t-il un meilleur moyen de créer cette boucle de jeu? (C ++ / Windows)
-
05-07-2019 - |
Question
Je travaille sur un jeu Windows, et j'ai ceci:
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;
}
et je me demande s’il existe un meilleur moyen de le faire (en ignorant les minuteries, etc.) que de faire en sorte que game_cont
soit global. En bref, je dois être en mesure de quitter le paramètre while dans WinMain
de WinProc
, de sorte que si l'utilisateur appuie sur la fermeture du jeu d'une manière autre que celle du jeu. dans le menu du jeu, le programme ne continuera pas à fonctionner en mémoire. (Comme ce fut le cas lorsque j'ai testé cela sans l'instruction game_cont ..
dans WinProc
.
Oh, et en passant, GameRun
est fondamentalement un booléen qui retourne false lorsque le jeu se termine et true sinon.
La solution
Oui, utilisez PeekMessage , c'est la norme dans le développement de jeux.
C’est la meilleure approche, je crois:
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;
}
}
}
Regardez également this (spécialement la première réponse)
Autres conseils
Vous pouvez créer game_cont
statique
dans votre fichier principal contenant WinMain
/ WinProc
, mais je ne t connaître une structure nettement meilleure.
Non, ne faites pas ça.
WM_QUIT
est votre drapeau. La valeur de retour GetMessage
indique quand WM_QUIT
est rencontré.
Votre fenêtre principale ne recevra jamais WM_QUIT
, car elle n'est pas envoyée à une fenêtre. WM_CLOSE
appellera DestroyWindow
par défaut, vous n'avez donc besoin d'aucun traitement spécial pour cela. Traitez WM_DESTROY
en appelant PostQuitMessage
, ce qui entraîne WM_QUIT
sur votre thread, la valeur de retour spéciale de GetMessage
, et arrête votre boucle d'envoi de messages.