Box2d - 动态更改接触过滤器

时间:2011-06-06 10:28:49

标签: objective-c cocos2d-iphone box2d objective-c++

我使用cocos2d(iOS)和box2d创建游戏 我已经到了需要更改接触过滤器中间模拟的地步,并想知道如何解决这个问题 我需要使用maskbits和categorybits,这很好,我只是不确定如何将它们应用到b2body游戏中。

我想我可能需要在初始化时检索b2body的原始b2fixture或b2fixturedef,相应地更改值然后调用方法刷新 - world.Refilter()?

这听起来有些准确吗?

任何建议肯定会受到赞赏 奥利弗。

3 个答案:

答案 0 :(得分:9)

b2Filter filter;

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

显然这会改变身体上所有灯具的滤波器设置 - 如果你想要更具选择性,你必须能够以某种方式告诉哪个灯具。例如。如果您知道它是唯一的圆形夹具,您可以查看要确定的夹具类型,否则您将不得不使用夹具的用户数据。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

iforce2d的答案可能已经过时了。我使用Xcode v4.5.2得到以下代码与box2d v2.2.1,cocos2D v2.0.0正常工作(这里我假设我有一个指向b2Body的指针,名为'body',只有一个夹具,即我不迭代身体上的所有装置):

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

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

GetFilterData(& filter)和SetFilterData(& filter)给出了我上面引用的版本号的错误。