【发布时间】:2013-09-09 23:03:38
【问题描述】:
我在 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被多次添加到要销毁的数组中,所以当数组满时,多次被销毁,导致死循环。
【问题讨论】:
-
你试过添加断点和NSLogs吗?
-
是的,有问题的循环是这个:
for (b2Contact* c = m_contactManager.m_contactList; c; c = c->m_next)但我不确定我是否真的理解它的作用,似乎m_contactManager.m_contactList没有结束。
标签: iphone ios cocos2d-iphone box2d objective-c++