2009-06-01 24 views
10

を知っていますか? またはそれらは既に衝突していますか?(body1.categoryBits & body2.maskBits)|| (body1.maskBits & body2.categoryBits)? BOX2D manualからBOX2D衝突グループ

答えて

15

6.2.3。フィルタリング

衝突フィルタリングは、形状間の衝突を防ぐためのシステムである です。 たとえば、自転車に乗っている という文字を作成するとします。 自転車を地形 に衝突させ、その人物を 地形と衝突させたいが、 文字を自転車 と衝突させたくない(重複しているため)。 Box2D は、カテゴリとグループを使用した衝突フィルタリング をサポートしています。

Box2Dは16個の衝突をサポートします カテゴリ。それぞれの図形について、 が属するカテゴリを指定することができます。 他のどのカテゴリを指定するか この図形が衝突する可能性があります。 たとえば、すべてのプレイヤー 同士が衝突していないと モンスターが他の各 と衝突していないが、プレイヤーとモンスターが 衝突すべき マルチプレイヤーゲームに指定することができます。これはマスキング ビットで行われます。たとえば:

playerShapeDef.filter.categoryBits = 0x0002; 
monsterShapeDef.filter.categoryBits = 0x0004; 
playerShape.filter.maskBits = 0x0004; 
monsterShapeDef.filter.maskBits = 0x0002; 

衝突グループは、あなたが 不可欠なグループインデックスを指定できます。同じグループインデックス が常に衝突(正のインデックス)または が衝突しない(負のインデックス)のすべての シェイプを持つことができます。グループ は、自転車の のように、何らかの形で関連しているもの に通常使用されます。次の の例では、shape1とshape2は常に が衝突しますが、shape3とshape4は決して が衝突します。異なる グループインデックスの形状間

shape1Def.filter.groupIndex = 2; 
shape2Def.filter.groupIndex = 2; 
shape3Def.filter.groupIndex = -8; 
shape4Def.filter.groupIndex = -8; 

衝突は カテゴリとマスクビットに従ってフィルタリングされます。 という単語では、グループフィルタリングはカテゴリフィルタリングよりも優先度が高い です。

3

BOX2Dのソースを見ると、それは次のようにcatgoryとマスクを比較する器具が異なるグループに属している場合(またはグループは0である)ことを示している:

bool collide = (filterA.maskBits & filterB.categoryBits) != 0 && 
        (filterA.categoryBits & filterB.maskBits) != 0; 

だから見た目両方の器具のマスクによって衝突が許容される場合にのみ衝突する。 (IE:ANDロジック)

11

これは、私がmaskBitsとcategoryBitsの仕組みを理解した方法です。 たとえば、objectA、objectB、objectCという3つのオブジェクトがあるとします。

各カテゴリオブジェクトの定義:

objectA.categoryBits = 0×0002を。
objectB.categoryBits = 0x0004;
objectC.categoryBits = 0x0008;

は次に、各categoryBitsため衝突ルールを定義maskBitsを設定:

- > ObjectAに皆(0xFFFFで)及び(&)と衝突しない(〜)をObjectB(0x0004は)
objectA.maskBits = 0xFFFF &〜0x0004;

- > objectBはobjectA(0x0002)または(|)objectC(0x0008)と衝突しますが、他にはありません。
objectB.maskBits = 0x0002 | 0x0008;

- > objectCはobjectA(0x0002)と衝突しますが、他にはありません
objectC.maskBits = 0x0002;

これが正しいかどうかわかりませんが、それは私にとっては効果的です。

HTH

、誰もがより一層の説明を探しているならば、私はここで詳細なチュートリアル作ら
+0

ありがとう、それは私のために働いた。 – noob

0

を。私のプレイヤーと敵は壁に衝突しますが、お互いに衝突することはありません。私はこのようにして働いた。お互いに衝突しないように、groupIndexを負の値に設定する必要があります。このような備品を定義してください。

/* The categories. */ 
public static final short CATEGORYBIT_WALL = 1; 
public static final short CATEGORYBIT_PLAYERS = 2; 

/* And what should collide with what. */ 
public static final short MASKBITS_WALL = CATEGORYBIT_WALL + CATEGORYBIT_PLAYERS; 

public static final FixtureDef WALL_FIXTURE_DEF = PhysicsFactory.createFixtureDef(0, 0.5f, 0.5f, false, CATEGORYBIT_WALL, MASKBITS_WALL, (short)0); 
public static final FixtureDef PLAYERS_FIXTURE_DEF = PhysicsFactory.createFixtureDef(1, 0.5f, 0.5f, false, CATEGORYBIT_PLAYERS, MASKBITS_WALL, (short)-1); 

あなたの身体に適用します。

AnimatedSprite player, enemy; 
Body playerBody, enemyBody; 

player= new AnimatedSprite(CAMERA_WIDTH/2, CAMERA_HEIGHT/2,  this.playerRegion, this.getVertexBufferObjectManager()); 
playerBody = PhysicsFactory.createBoxBody(this.mPhysicsWorld, player,  BodyType.DynamicBody, PLAYERS_FIXTURE_DEF); 
this.mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(player, playerBody, true, false)); 

enemy= new AnimatedSprite(CAMERA_WIDTH/4, CAMERA_HEIGHT/2, this.enemyRegion, this.getVertexBufferObjectManager()); 

enemyBody= PhysicsFactory.createCircleBody(this.mPhysicsWorld, enemy, BodyType.DynamicBody, PLAYERS_FIXTURE_DEF); 
this.mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(enemy, enemyBody, true, false)); 
関連する問題