2017-08-16 7 views
0

Je n'arrive pas à comprendre comment différencier les différents masques de bit.Différenciation entre différents masques de bit

Je veux que cela se produise:

/*func didBegin(_ contact: SKPhysicsContact) { 
if (spaceship1 collides with spaceship2) { 
    print("contact between 1 and 2") 
    } 
if (spaceship1 collides with spaceship3) { 
print("contact between 1 and 3") 
    } 
} 
*/ 

Voici le code que j'ai essayé:

func didBegin(_ contact: SKPhysicsContact) { 
    if (contact.bodyA.categoryBitMask = enemyCategory && contact.bodyB.categoryBitMask = enemy2Category) { 
     print("contact between 1 and 2") 
    } 
} 

Puis-je obtenir de l'aide?

EDIT: Voici l'autre code:

import SpriteKit 
import GameplayKit 

class GameScene: SKScene, SKPhysicsContactDelegate { 

let enemy2Category: UInt32 = 1 

let enemyCategory: UInt32 = 2 

let enemy3Category: UInt32 = 3 

var spaceship1: SKSpriteNode! 
var spaceship2: SKSpriteNode! 
var spaceship3: SKSpriteNode! 

override func didMove(to view: SKView) { 
    self.physicsWorld.contactDelegate = self 
    spaceship1 = SKSpriteNode(imageNamed: "Spaceship"); 
    spaceship1.setScale(CGFloat(0.1)) 
    spaceship1.position = CGPoint(x: self.frame.width/2, y: (self.frame.height/2)); 
    spaceship1.name = "spaceship1"; 


    spaceship1.physicsBody = SKPhysicsBody(circleOfRadius: spaceship1.size.width/2); 
    spaceship1.physicsBody?.isDynamic = true // apply gravity, friction, and collision 
    spaceship1.physicsBody?.affectedByGravity = true; 
    spaceship1.physicsBody?.allowsRotation = false 
    spaceship1.physicsBody = SKPhysicsBody(circleOfRadius: spaceship1.size.width/2); 
    spaceship1.physicsBody?.categoryBitMask = enemy2Category 
    spaceship1.physicsBody?.collisionBitMask = enemyCategory 
    spaceship1.physicsBody?.contactTestBitMask = enemyCategory 

    spaceship2 = SKSpriteNode(imageNamed: "Spaceship"); 
    spaceship2.setScale(CGFloat(0.1)) 
    spaceship2.position = CGPoint(x: self.frame.width/2, y: (spaceship1.position.y + 300)); 
    spaceship2.name = "spaceship2"; 

    spaceship2.physicsBody = SKPhysicsBody(circleOfRadius: spaceship2.size.width/2); 
    spaceship2.physicsBody?.isDynamic = true // apply gravity, friction, and collision 
    spaceship2.physicsBody?.affectedByGravity = false; 
    spaceship2.physicsBody?.allowsRotation = false 
    spaceship2.physicsBody = SKPhysicsBody(circleOfRadius: spaceship2.size.width/2); 
    spaceship2.physicsBody?.categoryBitMask = enemyCategory 
    spaceship2.physicsBody?.collisionBitMask = enemy2Category 
    spaceship2.physicsBody?.contactTestBitMask = enemy2Category 

    spaceship3 = SKSpriteNode(imageNamed: "Spaceship"); 
    spaceship3.setScale(CGFloat(0.1)) 
    spaceship3.position = CGPoint(x: self.frame.width/2, y: (spaceship1.position.y + 300)); 
    spaceship3.name = "spaceship3"; 

    spaceship3.physicsBody = SKPhysicsBody(circleOfRadius: spaceship2.size.width/2); 
    spaceship3.physicsBody?.isDynamic = true // apply gravity, friction, and collision 
    spaceship3.physicsBody?.affectedByGravity = false; 
    spaceship3.physicsBody?.allowsRotation = false 
    spaceship3.physicsBody = SKPhysicsBody(circleOfRadius: spaceship2.size.width/2); 
    spaceship3.physicsBody?.categoryBitMask = enemy3Category 
    spaceship3.physicsBody?.collisionBitMask = enemy2Category | enemyCategory 
    spaceship3.physicsBody?.contactTestBitMask = enemy2Category | enemyCategory 


    addChild(spaceship1) 

} 


     override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    addChild(spaceship3) 
} 

    override func update(_ currentTime: TimeInterval) { 
     spaceship1.physicsBody?.affectedByGravity = false; 
} 

}

Je suis juste essayer de comprendre comment détecter qui bitmasks entrer en contact les uns avec les autres. Comme si le vaisseau spatial1 entre en contact avec le vaisseau spatial2, il imprime yay, mais si le vaisseau spatial1 entre en contact avec le vaisseau spatial 3, il imprime "wow"

Répondre

0

Il y a un article de documentation qui tente d'expliquer les masques de bits utilisé dans une collision Sprite-Kit et contacts, mais je ne peux plus un lien vers elle. Essayez de trouver la page 'Documentation', la balise 'Sprite-Kit' puis la 'Manipulation de contactTest et les masques de bits collison pour activer/désactiver les contacts et collisions spécifiques.' article sous 'SKNode Collision'.

Un problème évident est cette ligne:

let enemy3Category: UInt32 = 3 

Tous bitmasks ont être pensé en binaire et en binaire 3 est 11. Ceci est le bit « 1 » et le bit « 2 » les deux étant mis à 1. définitions des catégories doit seulement avoir 1 bit à 1 qui vous offrir la garantie en utilisant les pouvoirs exacts de 2 pour vos catégories - 1, 2, 4, 8, 16, 32, etc.

Objets dans votre scène qui doit entrer en collision/contact doit appartenir à une seule catégorie au départ. Pour les contacts plus avancés et les collisions, un sprite peut appartenir à plusieurs catégories.

0

Il vous manque un = dans votre instruction if.

func didBegin(_ contact: SKPhysicsContact) { 
    if (contact.bodyA.categoryBitMask == enemyCategory && contact.bodyB.categoryBitMask == enemy2Category) { 
     print("contact between 1 and 2") 
    } 
} 
+0

@ G.L.. Avez-vous configuré correctement vos masques de bits de contact? Postez votre code où vous déclarez les masques de bit. – TheValyreanGroup

+0

Ouais, les collisions fonctionnent, mais je veux que ça fasse des choses différentes selon le bitmask –

+0

Je vais essayer d'expliquer ce que je veux mieux. –

0

Ceci définit firstBody à bitmask plus petit et met secondBody à la plus grande

 var firstBody = SKPhysicsBody() 
     var secondBody = SKPhysicsBody() 

     if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask { 
      firstBody = contact.bodyA 
      secondBody = contact.bodyB 
     }else{ 
      firstBody = contact.bodyB 
      secondBody = contact.bodyA 
     } 

Assuiming bitmask1 est inférieur à 2 et 3.

 if firstBody.categoryBitMask == bitMask1 && secondBody.categoryBitMask == bitMask.bitmask3 { 
      print("a") 

     //If ball hits a pad, activate the pad 
     }else if firstBody.categoryBitMask == bitMask1 && secondBody.categoryBitMask == bitMask.bitmask2 { 
      print("e") 
}