Я использую Box2D и Cocos2D для iOS.
Время от времени игра зависает из-за бесконечного цикла на 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];
}
Что я нахожу очень странным, так это то, что он не зависает каждый раз, а только иногда, и я не могу понять, что блокирует...
Решение. Тело несколько раз добавлялось в массив для уничтожения, поэтому, когда массив был заполнен, оно уничтожалось более одного раза, что вызывало бесконечный цикл.
for (b2Contact* c = m_contactManager.m_contactList; c; c = c->m_next)
Но я не уверен, что действительно понимаю, что он делает, кажется, чтоm_contactManager.m_contactList
не заканчивается. - person thegameg   schedule 10.09.2013