зависание / остановка приложения cocos2d box2d

#ios #iphone #cocos2d-iphone #box2d

#iOS #iPhone #cocos2d-iphone #box2d

Вопрос:

Мое приложение cocos2d box2d иногда зависает / останавливается. Пауза из отладчика получить эту строку из b2World.cpp . Что это значит? Возможно, проблема с моим contactlistener, без него приложение работает в обычном режиме.

 **// Clear all the island flags.
for (b2Body* b = m_bodyList; b; b = b->m_next)
{
    b->m_flags amp;= ~b2Body::e_islandFlag;**
  

Мой contactlistener. Обнаружить столкновение -> проверить фильтры -> push_back (тело) -> добавить тело в destroyArray -> уничтожить тело после временного интервала в методе обновления.

 std::vector<b2Body *>toEat;
std::vector<MyContact>::iterator pos3;
for (pos3 = _contactListener->_contacts.begin(); pos3 != _contactListener->_contacts.end();   pos3) {
MyContact contact = *pos3;

b2Body *bodyA = contact.fixtureA->GetBody();
b2Body *bodyB = contact.fixtureB->GetBody();

if (bodyA->GetUserData() != NULL amp; bodyB->GetUserData() != NULL) {

b2Fixture *fixtureA = bodyA->GetFixtureList();

b2Filter filterA = bodyA->GetFixtureList()[0].GetFilterData();
b2Filter filterB = bodyB->GetFixtureList()[0].GetFilterData();

//some filter stuff

if (filter == my filter) {

toEat.push_back(bodyB);

   }
  }
}


std::vector<b2Body *>::iterator pos4;
for(pos4 = toEat.begin(); pos4 != toEat.end();   pos4) {
    b2Body *body = *pos4;
    if (body->GetUserData() != NULL) {

        CCPhysicsSprite *sprite = (CCPhysicsSprite*)body->GetUserData();
        [self removeChild:sprite cleanup:YES];
        body->SetActive(false);
        [bodiesForDestroy addObject:[NSValue valueWithPointer:body]];
    }
}
  

Нашел эту ссылку, та же проблема

Комментарии:

1. ОК. Я решил это. Если одно маленькое тело со спрайтом улетит с экрана так далеко и не будет уничтожено, вы получите эту чертову ошибку.

2. Я действительно сомневаюсь, что это истинная причина проблемы — возможно, вы просто замаскировали ее, слегка изменив какое-то внутреннее состояние. Я предполагаю, что вы уничтожаете одно и то же тело дважды, потому что вектор toEat может содержать дубликаты. Попробуйте использовать std::set вместо std::vector.

3. iforce2d, вы правы! вчера я изменил тип своего массива (NSMutableArray на NSMutableOrderedSet) для разрушаемых тел.