swift sprite-kit skphysicsbody

¿Cómo funciona collisionBitMask? Swift/SpriteKit



sprite-kit skphysicsbody (1)

No puede obtener el comportamiento deseado porque no ha configurado correctamente las máscaras de bits de categoría, contacto y colisión. Aquí hay un ejemplo de cómo puede configurar esto para que funcione:

greenBall.physicsBody?.categoryBitMask = GreenBallCategory //Category is GreenBall greenBall.physicsBody?.contactTestBitMask = RedBarCategory | WallCategory //Contact will be detected when GreenBall make a contact with RedBar or a Wall (assuming that redBar''s masks are already properly set) greenBall.physicsBody?.collisionBitMask = GreenBallCategory | RedBallCategory | WallCategory //Collision will occur when GreenBall hits GreenBall, RedBall or hits a Wall redBall.physicsBody?.categoryBitMask = RedBallCategory //Category is RedBall redBall.physicsBody?.contactTestBitMask = GreenBarCategory | GreenBallCategory | WallCategory //Contact will be detected when RedBall make a contact with GreenBar , GreenBall or a Wall redBall.physicsBody?.collisionBitMask = RedBallCategory | GreenBallCategory | WallCategory //Collision will occur when RedBall meets RedBall, GreenBall or hits a Wall let borderBody = SKPhysicsBody(edgeLoopFromRect: self.frame) self.physicsBody = borderBody self.physicsBody?.friction = 0 borderBody.contactTestBitMask = RedBallCategory | GreenBallCategory //Contact will be detected when red or green ball hit the wall borderBody.categoryBitMask = WallCategory borderBody.collisionBitMask = RedBallCategory | GreenBallCategory // Collisions between RedBall GreenBall and a Wall will be detected

Le recomendaría leer documentos sobre categoryBitMask que es una máscara que define a qué categorías pertenece un cuerpo de física:

Cada cuerpo físico en una escena puede asignarse a hasta 32 categorías diferentes, cada una correspondiente a un bit en la máscara de bits. Usted define los valores de máscara utilizados en su juego. Junto con las propiedades collisionBitMask y contactTestBitMask, usted define qué cuerpos físicos interactúan entre sí y cuándo se notifica a su juego estas interacciones.

contactTestBitMask : una máscara que define qué categorías de cuerpos causan notificaciones de intersección con un cuerpo de física actual.

Cuando dos cuerpos comparten el mismo espacio, la máscara de categoría de cada cuerpo se prueba contra la máscara de contacto del otro cuerpo realizando una operación lógica AND. Si cualquier comparación resulta en un valor distinto de cero, se crea un objeto SKPhysicsContact y se pasa al delegado del mundo de física. Para obtener el mejor rendimiento, solo configure los bits en la máscara de contactos para las interacciones que le interesen.

collisionBitmask : una máscara que define qué categorías de cuerpos de física pueden colisionar con este cuerpo de física.

Cuando dos cuerpos físicos se contactan, puede ocurrir una colisión. La máscara de colisión de este cuerpo se compara con la máscara de la categoría del otro cuerpo realizando una operación lógica AND. Si el resultado es un valor distinto de cero, la colisión afecta a este cuerpo. Cada cuerpo elige independientemente si quiere ser afectado por el otro cuerpo. Por ejemplo, puede usar esto para evitar cálculos de colisión que podrían hacer cambios insignificantes en la velocidad de un cuerpo.

Básicamente, para configurar todo esto, debes preguntarte algo como:

De acuerdo, tengo una bola verde y una bola roja y objetos de pared en la escena. ¿Entre qué cuerpos quiero que se produzcan colisiones o cuándo quiero registrar contactos? Quiero que una bola verde y una roja colisionen entre sí y choquen contra las paredes. No es un problema. Primero configuraré las categorías correctamente, y luego estableceré máscaras de bits de colisión de esta manera:

greenBall.collisionBitMask = GreenBallCategory | RedBallCategory | WallCategory; //greenBall will collide with greenBall, redBall and a wall redBall.collisionBitMask = GreenBallCategory | RedBallCategory | WallCategory wall.collisionBitMask = GreenBall | RedBall

Ahora, quiero detectar cuándo ocurren algunos contactos (en didBeginContact : método) ... Pero no quiero que me avisen todos los contactos posibles, sino que me avisen sobre los contactos entre pelotas (contactos entre pelotas y una pared). será ignorado). Así que vamos a configurar contactTestBitMasks para lograr esto:

greenBall.contactTestBitMask = GreenBallCategory | RedBallCategory; redBall.contactTestBitMask = GreenBallCategory | RedBallCategory;

Y eso es. Lo importante es que cuando no utiliza la detección de contactos, no debe configurar contactTestBitMask . Esto se debe a razones de rendimiento. Si no necesita la detección de colisiones y está interesado solo en detectar contactos, puede configurar collisionBitMask = 0 .

Importante:

Asegúrese de haber configurado el delegado de contacto del mundo de física para utilizar los métodos didBeginContact y didEndContact :

self.physicsWorld.contactDelegate = self; //where self is a current scene

Espero que esto ayude un poco.

Por lo que sé, el valor predeterminado para los cuerpos de Física es rebotar entre sí cuando se golpean entre sí hasta que establezca su CollisionBitMask en un número igual.

Sin embargo, estoy teniendo un gran problema al lograr lo que parece que debería ser muy simple debido a la colisión.

let RedBallCategory : UInt32 = 0x1 << 1 let GreenBallCategory: UInt32 = 0x1 << 2 let RedBarCategory : UInt32 = 0x1 << 3 let GreenBarCategory : UInt32 = 0x1 << 4 let WallCategory : UInt32 = 0x1 << 5 greenBall.physicsBody?.categoryBitMask = GreenBallCategory greenBall.physicsBody?.contactTestBitMask = RedBarCategory greenBall.physicsBody?.collisionBitMask = GreenHealthCategory redBall.physicsBody?.categoryBitMask = RedBallCategory redBall.physicsBody?.contactTestBitMask = GreenBarCategory redBall.physicsBody?.collisionBitMask = RedHealthCategory let borderBody = SKPhysicsBody(edgeLoopFromRect: self.frame) self.physicsBody = borderBody self.physicsBody?.friction = 0 borderBody.contactTestBitMask = RedBallCategory | GreenBallCategory borderBody.categoryBitMask = WallCategory

Así que aquí tengo mis 2 bolas y mi cuerpo de borde. Puedo obtener la detección de colisión que quiero, pero cuando agrego la máscara de bits de la categoría del cuerpo del borde, permite que las bolas entren y salgan de la pantalla, lo cual no quiero.

También quiero que las pelotas reboten unas en otras, pero solo cuando comento una de las categorías de la categoría, BitMasks rebotan. De lo contrario, se atraviesan.

Eso no tiene ningún sentido para mí porque cada uno de estos elementos tiene una máscara de colisión diferente. También lo tuve a veces, donde establecer todos los números iguales a 5 permitiría que todo pasara el uno al otro, pero al establecerlo todo en 6 permitiría que todos se golpearan entre sí.

¿Cómo funcionan exactamente las máscaras de bits de colisión y hay una forma adecuada de gestionar muchas reglas de colisión entrecruzadas?