Можно ли поменять 2-3 раза f-›SetSensor()?

я использую cocos2d-iphone-0.99.2 и интегрированный в него box2d. у меня есть 2 типа спрайтов с тегами 1 и 2. Также я создал тела и определения формы для них. то, что я пытаюсь сделать, это заставить виды sprite1 действовать как твердые или действовать как нетвердые, когда sprite2 сталкивается с ними. я пробовал этот код:

for(b2Body *b = _world->GetBodyList(); b; b=b->GetNext()) 
{    
  if (b->GetUserData() != NULL) 
    {
      CCSprite *sprite = (CCSprite *)b->GetUserData();     
        if (sprite.tag == 1) 
        {
            b2Fixture* f = b->GetFixtureList();
            f->SetSensor(solid);
        }
    }
}

Где solid - это bool. В первый раз, когда я меняю приспособление на датчик, все в порядке, но когда я пытаюсь вернуться и снова изменить его на сплошное, мое приложение вылетает со следующей ошибкой: Утверждение не выполнено: (manifold->pointCount > 0), функция b2ContactSolver, файл /Documents /myapp/libs/Box2D/Dynamics/Contacts/b2ContactSolver.cpp, строка 58.

Можно ли как-то несколько раз менять фикстуру->SetSensor и если да... то как? Любая помощь высоко ценится.


person Asen    schedule 22.05.2010    source источник
comment
Найден обходной путь - уничтожить все виды спрайтов с тегом 1, также уничтожить и воссоздать их тела, фикстуры и суставы, а затем установить их фикстуры в Сенсор или нет. Все еще ищу решение сделать это динамически без необходимости разрушать и воссоздавать.   -  person Asen    schedule 22.05.2010


Ответы (1)


Ну... ответ заключается в том, что фикстуры хранятся в массивах, поэтому, если у вас есть только 1 фикстура на тело, это будет выглядеть так:

for(b2Body *b = _world->GetBodyList(); b; b=b->GetNext()){if (b->GetUserData() != NULL) 
{
  CCSprite *sprite = (CCSprite *)b->GetUserData();     
    if (sprite.tag == 1) 
    {
        b2Fixture* f = b->GetFixtureList();
        f[0]->SetSensor(solid);
    }
}

}

person Ahmed Ahmedov    schedule 05.10.2010