ios macos sprite-kit

ios - ¿Qué son la "Máscara de categoría" y la "Máscara de colisión" del Kit Sprite?



macos sprite-kit (1)

Estoy siguiendo la guía del Kit Sprite, y en el editor de escena me pide que configure la Máscara de categoría en 32 y la Máscara de colisión en 11. ¿Cómo se relacionan estos números?


  • La máscara de bits de categoría le dice a Sprite-Kit qué tipo de objeto es este.
  • La máscara de bits de colisión le dice a Sprite Kit con qué objetos choca este objeto (es decir, golpeará y rebotará).
  • La máscara de bits ContactTest le dice a Sprite-Kit sobre qué contactos desea que se le notifique, es decir, cuándo este objeto toca otro objeto.

Las colisiones son manejadas automáticamente por el motor del juego Sprite-Kit; los contactos son manejados por su código: cuando ocurre un contacto que le interesa, se didBeginContact'' su código ( didBeginContact'' para Swift 2, ''didBegin(contact:) para Swift 3 y posterior).

Debe pensar en estas máscaras de bits en binario y, para simplificar, comenzaremos con máscaras de bits de categoría simples, en las que cada objeto en su escena pertenece a una sola categoría.

Por ejemplo, en tu escena tienes un jugador, un misil jugador, un enemigo y el borde de la pantalla. Asumiremos que las máscaras de bits son de 8 bits en lugar de 32 bits. Piense en cada número como un rango de 8 dígitos binarios (8 bits), cada uno de los cuales es un 0 o 1.

Los objetos en su escena deben tener categorías únicas, por lo que los asignaremos de la siguiente manera:

player.categoryBitMask = 00000001 (1 in decimal) playerMissile.categoryBitMask = 00000010 (2 in decimal) enemy.categoryBitMask = 00000100 (4 in decimal) screenEdge.categoryBitMask = 00001000 (8 in decimal)

Si usa números que son, en decimal, algo diferente de una potencia de 2 (1, 2, 4, 8, 16, 32, 64, 128, etc.), se establecerá más de 1 bit en la máscara de bits de categoría que complica cosas (significa que este objeto pertenece a múltiples categorías) y su código tiene que ser más complicado.

Ahora piense en qué rebota de qué (las colisiones). Digamos que todo rebota en todo lo demás, excepto que el misil atraviesa el borde de la pantalla.

Las máscaras de bits de colisión para cada objeto consisten en los bits que representan los objetos con los que este objeto colisiona, es decir:

player.collsionBitMask = 00001111 (15 in decimal) (the bits for all other objects are set) playerMissile.collisionBitMask = 00000111 (7) (all object EXCEPT screenEdge) enemy.collisonBitMask = 00001111 (15) (everything) screenEdge.collisonBitMask = 00000000 (0) (collides with nothing)

Ahora pensamos en qué interacciones de objetos nos interesan. Queremos saber cuándo:

  • jugador y toque enemigo
  • toque enemigo y jugador o el toque enemigo y misil del jugador.

Esto está representado por:

player.contactTestBitMask = 00000100 (4) (the enemy''s categoryBitMask) enemy.contractTestBitMask = 00000011 (3) (the player''s categoryBitMask combined with the missile''s categoryBitMask))

Tenga en cuenta que si desea saber cuándo A y B se tocan, basta con que contactTestBitMask (CTBM) de A incluya la categoríaBitMask de B; no es necesario que el CTBM de B se establezca también en la categoría de A. Pero si desea que reboten entre sí, entonces collisionBitMask de cada objeto debe incluir la categoríaBitMask del otro. Si collisonbitMask de A incluye la categoría de B, pero no al revés, entonces cuando las 2 colisionen, A rebotará pero B no se verá afectado por ella.

Para su ejemplo específico, (Categoría Máscara a 32 y máscara de colisión a 11), la categoría 00100000 es 32, que es 00100000 (con solo 8 bits). CollisionBitMask es 11, que es 8 + 4 + 1, así que en binario es ''00001101'', lo que significa que colisiona con objetos con una categoría BitMask de 8, 4 o 1, por lo que supongo que hay objetos en su escena con estas categoryBitMasks.

Por defecto, todo rebota en todo lo demás, es decir, collisionBitMask es todo ''1, es decir, b''111111 ..'' y nada notifica los contactos con nada más, es decir, contactTestBitMask es todo ''0''.

Además, todo esto se aplica a los cuerpos de física, no a los nodos.