2009-06-01 16 views
10

qualcuno sa se i corpi si scontrano solo quando (body1.categoryBits & body2.maskBits) & & (body1.maskBits & body2.categoryBits)? o si scontrano già quando (body1.categoryBits & body2.maskBits) || (body1.maskBits & body2.categoryBits)?gruppi di collisione box2d

risposta

15

Dal Box2D manual:

6.2.3. Filtro

Il filtro di collisione è un sistema per che impedisce la collisione tra le forme. Ad esempio, supponi di creare un personaggio che va in bicicletta. Si vuole la bicicletta a collidere con il terreno e il carattere entrare in collisione con il terreno , ma non si desidera che il carattere a collidere con la bicicletta (perché devono sovrapporsi). Box2D supporta tale filtro di collisione utilizzando categorie e gruppi.

Box2D supporta 16 collisioni categorie. Per ogni forma è possibile specificare a quale categoria appartiene. È inoltre possibile specificare quali altre categorie possono entrare in collisione con questa forma. Ad esempio, è possibile specificare in un gioco multiplayer che tutti i giocatori non entrare in collisione con l'altro e mostri non si scontrano gli uni con gli altri , ma i giocatori e mostri dovrebbero scontrano. Questo è fatto con mascheratura bit. Per esempio:

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

gruppi di collisione consentono di specificare un indice gruppo integrale . È possibile avere tutte le forme con lo stesso indice di gruppo collidere sempre (indice positivo) o non collidere mai (indice negativo). Gli indici di gruppo vengono solitamente utilizzati per le cose che sono in qualche modo correlate, come le parti di una bicicletta . Nel seguente esempio , shape1 e shape2 sono sempre collide, ma shape3 e shape4 mai collide.

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

collisioni tra forme dei diversi indici gruppo vengono filtrati in base i bit di categoria e della maschera. Nelle altre parole, il filtro di gruppo ha una precocità superiore a rispetto al filtro di categoria.

3

Guardando la fonte di Box2d, mostra che se gli infissi appartengono a diversi gruppi (oi gruppi sono 0) poi il catgory e le maschere sono confrontati come segue:

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

Quindi sembra come il dispositivo si scontrano solo se la collisione è consentita da entrambe le maschere dei proiettori. (IE: logica AND)

11

Questo è il modo in cui ho capito come funzionano maskBits e categoryBit. Supponiamo di avere 3 oggetti: oggettoA, oggettoB e oggettoC.

Definire per ogni oggetto una categoria:

objectA.categoryBits = 0x0002;
objectB.categoryBits = 0x0004;
objectC.categoryBits = 0x0008;

Poi, impostare le maskBits, che definiscono le regole di collisioni per ogni categoryBits:

-> Objecta entrare in collisione con tutti (0xFFFF) e (&) non (~) ObjectB (0x0004)
objectA.maskBits = 0xFFFF & ~ 0x0004;

-> objectB collide con objectA (0x0002) o (|) objectC (0x0008) ma nessun altro
objectB.maskBits = 0x0002 | 0x0008;

-> objectC collisione con objectA (0x0002) ma nessun altro
objectC.maskBits = 0x0002;

Non so se questo è corretto, ma ha funzionato per me.

HTH

+0

Grazie, ha funzionato per me. – noob

0

Ho usato pareti e molti giocatori (il nostro giocatore e nemici) . Il mio giocatore e i suoi nemici entrano in collisione con i muri ma non si scontrano tra loro. Ho fatto così e ha funzionato. Devi impostare groupIndex su un valore negativo affinché gli oggetti non entrino in collisione tra loro. Definire i dispositivi come questo.

/* 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); 

e applicare ai vostri corpi.

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));