具有多个对象回调的游戏循环 - 第二个对象没有任何反应
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
【讨论】:
以上是关于具有多个对象回调的游戏循环 - 第二个对象没有任何反应的主要内容,如果未能解决你的问题,请参考以下文章