문제

나는 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 글로벌이어야합니다. 요컨대, 나는 잠시 동안 나갈 수 있어야한다 WinMain ~에서 WinProc, 사용자가 게임 메뉴에서 게임이 게임에서 닫히면 프로그램이 계속 실행되지 않습니다. (내가 이것을없이 이것을 테스트했을 때와 마찬가지로 game_cont.. 진술 WinProc.

아, 그리고 부수적으로, GameRun 기본적으로 게임이 끝나면 거짓을 반환하는 부리입니다. 그렇지 않으면 사실입니다.

도움이 되었습니까?

해결책

예, 사용하십시오 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;
        }
    }
} 

또한 봐 이것 (특히 첫 번째 답변)

다른 팁

당신은 사용할 수 있습니다 출구. 사용 atexit wm_close가 종료 할 때 메시지 큐에 도달하는지 확인합니다.

나는 여기에 궁극적 인 디자인이 무엇인지 모르겠지만 아이디어입니다.

당신은 만들 수 있습니다 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