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)为我返回了错误。