هل هناك طريقة أفضل لإنشاء حلقة اللعبة هذه؟ (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;
}

وأنا أتساءل عما إذا كانت هناك طريقة أفضل للقيام بذلك (تجاهل أجهزة ضبط الوقت & 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;
        }
    }
} 

أيضا ، انظر إلى هذه (خاصة الإجابة الأولى)

نصائح أخرى

يمكنك استخدام خروج. يستخدم atexit للتأكد من أن WM_CLOSE يصل إلى رسائل Que عندما حان الوقت للخروج.

لا أعرف ما هو التصميم النهائي هنا ، لكنها فكرة.

يمكن أن تجعل game_cont static إلى ملفك الرئيسي الذي يحتوي WinMain/WinProc, ، لكني لا أعرف بنية أفضل بكثير.

لا ، لا تفعل ذلك.

WM_QUIT هو علمك. GetMessage تشير قيمة الإرجاع إلى متى WM_QUIT واجه.

لن تتلقى نافذتك الرئيسية أبدًا WM_QUIT, ، لأنه لم يتم إرساله إلى نافذة. WM_CLOSE سوف يتصل DestroyWindow بشكل افتراضي ، لذلك لا تحتاج إلى أي معالجة خاصة لذلك. يتعامل WM_DESTROY بالاتصال PostQuitMessage, ، مما يؤدي إلى WM_QUIT على موضوعك ، قيمة الإرجاع الخاصة من GetMessage, ، ويوقف حلقة إرسال رسالتك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top