C++ 多对象回调的游戏循环-第二个对象不会发生任何事情

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()设置ObjectA,然后设置ObjectB,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
    }
}
检查后,您的代码很可能会执行以下操作:

  • 遍历所有消息,逐个丢弃它们
  • 在所有消息都被“处理”之后,调用将使用最后一条消息的参数进行更新,这些参数(我假设)在“/*..*/”块中读取
  • 你能试试这个变体吗

    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
        }
    }