我在 iOS 上使用 Box2D 和 Cocos2D。
有时,游戏会卡住,这是由 b2World::SolveTOI 上的无限循环引起的。
for (b2Contact* c = m_contactManager.m_contactList; c; c = c->m_next)
{
// Invalidate TOI
c->m_flags &= ~(b2Contact::e_toiFlag | b2Contact::e_islandFlag);
c->m_toiCount = 0;
c->m_toi = 1.0f;
}
我有一个“英雄”必须收集硬币的游戏。硬币是物体,通过接触侦听器,我将物体添加到数组中,以便稍后在数组已满时销毁它们(计数 = 2)。
这是我向数组添加主体的方法:
+ (void) addBodyToDestroy:(b2Body *)body {
[toDestroyArray addObject:[NSValue valueWithPointer:body]];
}
这就是我如何摧毁它们:
+ (void) destroyAllBodies {
b2World *world = [InGame getWorld];
for (NSValue *bodyValue in toDestroyArray)
{
b2Body *body;
body = (b2Body*)[bodyValue pointerValue];
world->DestroyBody(body);
body = NULL;
}
[toDestroyArray removeAllObjects];
}
我觉得很奇怪的是它不会每次都冻结,只是有时,而且我无法知道似乎阻塞了什么......
解决方法:body被多次添加到要销毁的数组中,所以当数组满的时候,多次被销毁,导致死循环。