Box2d - Замена контактного фильтра на лету - PullRequest
3 голосов
/ 06 июня 2011

Я использую cocos2d (iOS) и box2d для создания игры.
Я пришел к тому моменту, когда мне нужно изменить фильтр контактов в середине симуляции, и мне интересно, как это сделать.
Мне нужно использоватьЭто нормально, я просто не знаю, как применить их к середине игры b2body.

Я думаю, что мне может понадобиться получить исходную b2fixture или b2fixturedef b2body при инициализации, соответственно изменить значения и затем вызвать метод refresh - world.Refilter ()?

Это звучит несколько точно?

Любой совет, безусловно, ценится
Оливер.

Ответы [ 3 ]

9 голосов
/ 07 июня 2011
b2Filter filter;

for ( b2Fixture* f = body->GetFixtureList(); f; f = f->GetNext() ) {
    f->GetFilterData( &filter );
    filter.categoryBits = ...;
    filter.maskBits = ...;
    filter.groupIndex = ...;
    f->SetFilterData( &filter );
}

Очевидно, это изменит настройки фильтра для всех приборов на теле - если вы хотите быть более избирательным, вам нужно будет определить, какой прибор каким-то образом.Например.если вы знаете, что это единственный круговой прибор, вы можете просто посмотреть на тип прибора, чтобы решить, в противном случае вам, вероятно, придется использовать пользовательские данные прибора.

0 голосов
/ 23 июля 2013

Ответ от iforce2d может быть устаревшим.Я получил следующий код, работающий должным образом с box2d v2.2.1, cocos2D v2.0.0 с использованием Xcode v4.5.2 (здесь я предполагаю, что у меня есть указатель на b2Body с именем 'body' только с одним фиксатором, т.е. я не выполняю итерации повсе приборы на теле):

b2Fixture *fix = body->GetFixtureList();
b2Filter filter = fix->GetFilterData();   
filter.groupIndex = -1*kPlayerGroupIndex; 
fix->SetFilterData(filter);

В приведенном выше коде я предотвращаю столкновение «тела» с телом моего игрока, которое также имеет такое же значение groupIndex, то есть -1 * kPlayerGroupIndex, где kPlayerGroupIndex являетсяцелочисленная положительная константа.Любые тела с этим отрицательным индексом группы никогда не сталкиваются друг с другом.Вы также можете соответствующим образом обновить categoryBits или maskBits для предотвращения коллизий.

GetFilterData (& filter) и SetFilterData (& filter) вернули мне ошибки, учитывая номера версий, которые я цитировал выше.

0 голосов
/ 06 июня 2011

Вы можете перебирать все тела в b2World. На каждом теле вы можете перебрать его и изменить его фильтр. Для идентификации вашего тела вы можете использовать userData.

...