目标c-Box2d-在飞行中改变接触过滤器



Im使用cocos2d(iOS)和box2d创建游戏
我已经到了需要在模拟过程中更改接触滤波器的地步,并想知道如何进行此操作
我需要使用maskbits和categorybits,这很好,我只是不确定如何将它们应用于b2body游戏中期。

我想我可能需要在初始化时检索b2body的原始b2fixture或b2fixturedef,相应地更改值,然后调用一个方法来刷新-world。再过滤器()?

这听起来有点准确吗?

任何建议都将不胜感激
奥利弗

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

显然,这将更改身体上所有固定装置的过滤器设置——如果你想更有选择性,你必须能够以某种方式分辨出哪个固定装置是哪个。例如,如果你知道这是唯一的圆形夹具,你可以看看夹具的类型来决定,否则你就必须利用夹具的用户数据。

您可以迭代b2World中的所有实体。在每个主体上,您可以迭代它的fixture并更改它的过滤器。要识别您的身体,您可以使用userData。

iforce2d的答案可能已经过时。我使用Xcode v4.5.2获得了以下代码,这些代码与box2d v2.2.1、cocos2D v2.0.0一起正常工作(这里我假设我有一个指向名为"body"的b2Body的指针,只有一个fixture,也就是说,我不会迭代body上的所有fixture):

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

在上面的代码中,我防止"body"与我的播放器body发生冲突,该播放器body也具有相同的groupIndex值,即-1*kPlayerGroupIndex,其中kPlayerGroup Index是一个正整数常量。任何具有此负组Index的实体都不会相互碰撞。您也可以相应地更新categoryBits或maskBits以防止冲突。

给定上面引用的版本号,GetFilterData(&filter)和SetFilterData(&filter)为我返回了错误。

最新更新