Използвам 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