هل هناك طريقة أفضل لإنشاء حلقة اللعبة هذه؟ (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;
}
وأنا أتساءل عما إذا كانت هناك طريقة أفضل للقيام بذلك (تجاهل أجهزة ضبط الوقت & c. game_cont
كن عالميا. باختصار ، يجب أن أكون قادرًا على الخروج من الوقت WinMain
من WinProc
, ، بحيث إذا ضغط المستخدم على الإغلاق من اللعبة بطريقة أخرى في قائمة اللعبة في اللعبة ، فلن يستمر البرنامج في تشغيل الذاكرة. (كما فعلت عندما اختبرت هذا بدون game_cont..
بيان في WinProc
.
أوه ، وعلى ملاحظة جانبية ، GameRun
هو في الأساس منطقي يعيد خطأ عندما تنتهي اللعبة ، وصحيح خلاف ذلك.
المحلول
نعم ، استخدم نظرة خاطفة, ، إنه المعيار في تطوير اللعبة.
هذا هو أفضل طريقة ، على ما أعتقد:
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;
}
}
}
أيضا ، انظر إلى هذه (خاصة الإجابة الأولى)
نصائح أخرى
يمكن أن تجعل game_cont
static
إلى ملفك الرئيسي الذي يحتوي WinMain
/WinProc
, ، لكني لا أعرف بنية أفضل بكثير.
لا ، لا تفعل ذلك.
WM_QUIT
هو علمك. GetMessage
تشير قيمة الإرجاع إلى متى WM_QUIT
واجه.
لن تتلقى نافذتك الرئيسية أبدًا WM_QUIT
, ، لأنه لم يتم إرساله إلى نافذة. WM_CLOSE
سوف يتصل DestroyWindow
بشكل افتراضي ، لذلك لا تحتاج إلى أي معالجة خاصة لذلك. يتعامل WM_DESTROY
بالاتصال PostQuitMessage
, ، مما يؤدي إلى WM_QUIT
على موضوعك ، قيمة الإرجاع الخاصة من GetMessage
, ، ويوقف حلقة إرسال رسالتك.