2010-05-12 40 views
5

Tôi đang tạo ra trò chơi Mario như trong win32 GDI. Tôi đã triển khai vòng lặp mới cho trò chơi:Vòng lặp trò chơi trong Win32 API

PeekMessage(&msg,NULL,0,0,PM_NOREMOVE); 

while (msg.message!=WM_QUIT) 
{ 
    if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 
    else // No message to do 
    { 
     gGameMain->GameLoop(); 
    } 
} 

Nhưng trò chơi của tôi chỉ chạy cho đến khi tôi nhấn Ctrl + Alt + Del (con trỏ chuột đang lăn).

+1

Câu hỏi là gì? –

+2

trả về 'GameLoop()'? –

+0

Câu hỏi thực sự ngu ngốc nhưng bạn đã có một cửa sổ proc để xử lý các cửa sổ tin nhắn, phải không? – zebrabox

Trả lời

6

Tôi đã luôn luôn được sử dụng một cái gì đó như thế:

MSG msg; 
    while (running){ 
     if (PeekMessage(&msg, hWnd, 0, 0, PM_REMOVE)){ 
      TranslateMessage(&msg); 
      DispatchMessage(&msg); 
     } 
     else 
      try{ 
       onIdle(); 
      } 
      catch(std::exception& e){ 
       onError(e.what()); 
       close(); 
      } 
    } 

onIdle là thực tế thực hiện trò chơi lopp, onerror() là một xử lý lỗi (mất mô tả lỗi như là đối số), và "chạy" hoặc là một biến bool chung hoặc thành viên lớp. Đặt "chạy" thành false sẽ tắt trò chơi.

5

Tôi nghĩ điều này thực sự phụ thuộc vào ngữ cảnh của bạn. Windows sẽ chỉ gửi WM_QUIT để trả lời ứng dụng của bạn, gọi là PostQuitMessage. Một giải pháp phổ biến (nếu không tuyệt vời) ở đây là sử dụng một bool để thoát khỏi vòng lặp tin nhắn khi chương trình của bạn muốn kết thúc.

2

Tôi đoán chương trình có thể yêu cầu người dùng tiếp tục hoặc thoát, bên trong cuộc gọi hàm GameLoop. Khi thoát bài đăng WM_QUIT tin nhắn vào cửa sổ.

PostMessage(hWnd, WM_QUIT, 0, 0); 

hWnd-> Tay cầm của cửa sổ trò chơi

khác thực hiện cuộc gọi đến

DestroyWindow(hWnd); 

này sẽ gửi một WM_DESTROY thủ tục cửa sổ của bạn. Ở đó bạn có thể gọi

PostQuitMessage(0);  
Các vấn đề liên quan