2012-08-13 25 views
1

我有兩個類,都從相同的基類繼承。這是一個遊戲循環,取決於你所在的「狀態」,它應該在CALLBACK方法中發送一個指向活動對象的指針 - 但它不會。它只發送第二個對象的指針。具有多個對象回調的遊戲循環 - 第二個對象沒有任何反應對象

如果我首先通過PostMessage()和ObjectB設置ObjectA,然後ObjectB不起作用,它不會獲得指向該對象的指針。

如果我設置了相反的,ObjectB工作,而ObjectA不工作。

這是循環的總體佈局: (我錯過什麼?)

遊戲循環:

PostMessage(hwnd, WM_USER, 0, (LPARAM)&ObjectA); 
PostMessage(hwnd, WM_USER, 0, (LPARAM)&ObjectB); 

while(running) 
{ 
    while(PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) 
    { 
     /* ... */ 
    } 

    if (STATE == StateA) 
    Update(&ObjectA); 

    if (STATE == StateB) 
    Update(&ObjectB); 
} 

在回調方法:

static ObjectA* objA; 
static ObjectB* objB; 

if (objA || objB) 
{ 
    // Do stuff to objA or objB 
} 
else 
    switch(msg) 
    { 
     case WM_USER: 

     if (STATE == StateA) 
      objA = (ObjectA*) lparam; 

     if (STATE == StateB) 
      objB = (ObjectB*) lparam; 
     break; 

     // default and WM_CLOSE 
    } 
} 
+0

例如,它響應objectA上的WM_KEYDOWN,但如果將狀態更改爲B,則它不響應WM_KEYDOWN,因爲ObjectB永遠不會獲取指針。 – Deukalion 2012-08-13 19:25:37

+0

當您嘗試獲取第二條消息時究竟發生了什麼? – 2012-08-13 19:33:07

+0

使用此示例訪問violotion。剛剛嘗試了另一種方法,使用基類作爲存儲指針的對象 - 所以只有一個對象指針。獲取時也會出錯。爲什麼我不能有兩個對象將事件發送到回調?如果這是正確的話。 – Deukalion 2012-08-13 19:53:54

回答

0
while(PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) 
{ 
    /* ... */ 
} 

在審查,你的代碼最有可能做到以下幾點:

  1. 遍歷所有消息,丟棄它們一個接一個
  2. 後所有的消息已經被「處理」,調用讀取最後的消息的參數,其是(I假設)更新的「/ * ... * /「塊。

你可以嘗試這種變化嗎?

while(running) 
{ 
    while(PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) 
    { 
     /* ... */ 

     if (STATE == StateA) 
     Update(&ObjectA); 

     if (STATE == StateB) 
     Update(&ObjectB); // Note the "Update" callbacks moved to inner loop 
    } 
} 
相關問題