具有多个对象回调的游戏循环 - 第二个对象没有任何反应

Posted

技术标签:

【中文标题】具有多个对象回调的游戏循环 - 第二个对象没有任何反应【英文标题】:Game loop with multiple objects callback - nothing happens with second Object 【发布时间】:2012-08-13 19:22:52 【问题描述】:

我有两个类,都继承自同一个基类。这是一个游戏循环,根据你所处的“状态”,它应该在 CALLBACK 方法中发送一个指向活动对象的指针——但它没有。它只发送第二个对象的指针。

如果我首先通过 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
    

【问题讨论】:

一个例子,它响应 objectA 上的 WM_KEYDOWN,但如果我将状态更改为 B,它不会响应 WM_KEYDOWN,因为 ObjectB 永远不会获得指针。 当您尝试获取第二条消息时究竟会发生什么? 访问冲突,以本例为例。只是尝试了一个不同的方法,使用基类作为对象来存储指针——所以只有一个对象指针。这样做时也会出错。为什么我不能让两个对象向回调发送事件?如果这是正确的术语。 第一个对象是菜单,第二个对象是游戏。它们都使用相同的基类,每个共享相同的 Screen 对象等,只是根据状态,它们应该只在正确的状态下处于活动状态。 第一个对象(菜单)响应键盘,进入第二个状态(游戏)时不响应键盘事件。更改顺序(首先是游戏,最后是菜单)它会因访问冲突而崩溃。 【参考方案1】:
while( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) )

    /* ... */

审查后,您的代码很可能会执行以下操作:

    遍历所有消息,一个接一个地丢弃它们 “处理”完所有消息后,使用最后一条消息的参数调用 Update,这些参数(我假设)在“/* ... */”块中读取。

你能试试这个变化吗?

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
    

【讨论】:

以上是关于具有多个对象回调的游戏循环 - 第二个对象没有任何反应的主要内容,如果未能解决你的问题,请参考以下文章

Jquery 数组操作

jquery each 和 map 区别

jquery中each遍历对象和数组

jquery数组封装使用方法分享(jquery数组遍历)

js-权威指南学习笔记19

不能创建多个 VAO