Farseer: ¿Qué puedo hacer para que un cuerpo pueda moverse a través de un tipo especial de cuerpos?

Tengo tres types diferentes de rectangularjs. Rectangularjs negros, blancos y azules. Los rectangularjs se mueven y pueden colisionar entre sí. Pero con una exception, el rectángulo azul puede colisionar normalmente con el rectángulo negro, pero el rectángulo azul debe moverse a través del rectángulo blanco si está tocando el rectángulo blanco. Los rectangularjs blanco y negro pueden colisionar normalmente.

¿Cómo puedo hacer eso? En este momento, el rectángulo azul no se mueve a través del rectángulo blanco si toca el rectángulo blanco. ¿Qué puedo hacer para que el rectángulo azul se pueda mover a través del rectángulo blanco, pero no a través del rectángulo negro?

Resolví el problema con CollisionWidth.

Para expamle: Body.CollisionWidth = Categorie.Cat5

En este caso, el cuerpo simplemente colisiona con los cuerpos que tienen la categoría de colisión 5.

Ha pasado un time desde que toqué Farseer, pero si recuerdo bien, comparte una API muy similar a Box2d.

Entonces deberías tener algo como: Fixture.filter.categorybits; Fixture.filter.maskbits; Fixture.filter.categorybits; Fixture.filter.maskbits;

Así que supongamos que su caja azul está configurada: Fixture.filter.categorybits = 0x0001; Fixture.filter.maskbits = 0x003; Fixture.filter.categorybits = 0x0001; Fixture.filter.maskbits = 0x003;

Su caja negra está configurada: Fixture.filter.categorybits = 0x0002; Fixture.filter.maskbits = 0x0007; Fixture.filter.categorybits = 0x0002; Fixture.filter.maskbits = 0x0007;

Y su cuadro blanco está configurado: Fixture.filter.categorybits = 0x0004; Fixture.filter.maskbits = 0x0007; Fixture.filter.categorybits = 0x0004; Fixture.filter.maskbits = 0x0007;

Lo que esto significa es que cada máscara especifica con qué categorías colisiona. Por lo tanto, las casillas en blanco y negro colisionan con todo (0x0007 = 00000111), mientras que las casillas azules chocan solo con las casillas azul y negra.

Digamos que tienes un jugador y un montón de fichas.

Luego puedes establecer una categoría en cada uno. Esto se hace por un valor de bit.

Un bit contiene 0000.0000 lugares para ser asignados.

Lo mejor que puede hacer es usar valores como 2, 4, 8, 16, 32, 64.

Entre los valores puede causar una colisión dentro del bit y hacer que caiga una categoría o una máscara.

Entonces primero crea categorías.

 short PLAYER_BIT = 2; short BLOCK_BIT = 4; 

Luego, al crear un object, ha creado un FixtureDef() para este elemento.

  FixtureDef fdef = new FixtureDef(); fdef.shape = shape; fdef.density = 1.062f; fdef.filter.categoryBits = PLAYER_BIT;//This is the catagory, which type it is in bits. fdef.filter.maskBits = BLOCK_BIT;//The mask, which it can collide with. 

Ahora para el (los) bloque (s) usted hace exactamente lo contrario.

 fdef.filter.categoryBits = BLOCK_BIT;//Because it is a block. fdef.filter.maskBits = PLAYER_BIT;//Because block can only collide with player. 

También puede asignar máscaras o categorías múltiples, pero necesita conocer operadores de bits. Aquí hay algo de información sobre bit-operadores . Espero que esto ayude.