C++ 多对象回调的游戏循环-第二个对象不会发生任何事情
我有两个类,都是从同一个基类继承的。这是一个游戏循环,根据你所处的“状态”,它应该在回调方法中发送一个指向活动对象的指针,但实际上不是。它只发送第二个对象的指针 如果我先通过PostMessage()设置ObjectA,然后设置ObjectB,ObjectB不起作用,它就不会得到指向该对象的指针 如果我设置相反的值,ObjectB工作而ObjectA不工作 这是环路的总布置图: (我错过了什么?) 游戏循环:C++ 多对象回调的游戏循环-第二个对象不会发生任何事情,c++,pointers,callback,postmessage,game-loop,C++,Pointers,Callback,Postmessage,Game Loop,我有两个类,都是从同一个基类继承的。这是一个游戏循环,根据你所处的“状态”,它应该在回调方法中发送一个指向活动对象的指针,但实际上不是。它只发送第二个对象的指针 如果我先通过PostMessage()设置ObjectA,然后设置ObjectB,ObjectB不起作用,它就不会得到指向该对象的指针 如果我设置相反的值,ObjectB工作而ObjectA不工作 这是环路的总布置图: (我错过了什么?) 游戏循环: PostMessage( hwnd, WM_USER, 0, (LPARAM)&
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
}
}
检查后,您的代码很可能会执行以下操作:
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
}
}
例如,它响应objectA上的WM_KEYDOWN,但如果我将状态更改为B,它不会响应WM_KEYDOWN,因为ObjectB从未获得指针。当您尝试获取第二条消息时,会发生什么?访问violotion,以本例为例。只是尝试了另一种方法,使用基类作为对象来存储指针-因此只有并且总是一个对象指针。执行此操作时也会获取错误。为什么我不能让两个对象向回调发送事件?如果这是正确的术语,第一个对象是菜单,第二个对象是游戏。它们都使用相同的基类,每个基类共享相同的屏幕对象,仅取决于状态,它们只应在正确的状态下处于活动状态。第一个对象(菜单)响应键盘,当进入第二个状态(游戏)时,它不响应键盘事件。更改顺序(游戏优先,菜单最后)会因访问冲突而崩溃。
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
}
}