2017-03-22 2 views
1

J'essaie d'obtenir ma tête autour de la façon dont fonctionne la détection de collision lors de la mise énumérations. J'ai plusieurs noeuds différents sur lesquels je peux détecter une collision et je me suis mis au travail, mais je viens juste de l'aileronner et je ne comprends pas comment l'installer correctement.Swift détection des collisions et la mise énumérations

enum ColliderType: UInt32{ 

    case ship = 1 
    case object = 2 
    case fuel = 4 
    case alien = 8 
    case torp = 16 

} 

J'ai chaque nœud mis en place en tant que tel:

mete.physicsBody!.contactTestBitMask = ColliderType.object.rawValue 
mete.physicsBody!.categoryBitMask = ColliderType.object.rawValue 
mete.physicsBody!.collisionBitMask = ColliderType.object.rawValue 

alien.physicsBody!.contactTestBitMask = ColliderType.torp.rawValue 
alien.physicsBody!.categoryBitMask = ColliderType.alien.rawValue 
alien.physicsBody!.collisionBitMask = ColliderType.alien.rawValue 

fuel.physicsBody!.contactTestBitMask = ColliderType.ship.rawValue 
fuel.physicsBody!.categoryBitMask = ColliderType.fuel.rawValue 
fuel.physicsBody!.collisionBitMask = ColliderType.fuel.rawValue 


ship.physicsBody!.contactTestBitMask = ColliderType.object.rawValue 
ship.physicsBody!.categoryBitMask = ColliderType.ship.rawValue 
ship.physicsBody!.collisionBitMask = ColliderType.ship.rawValue 

torpedoNode.physicsBody!.contactTestBitMask = ColliderType.alien.rawValue 
torpedoNode.physicsBody!.categoryBitMask = ColliderType.torp.rawValue 
torpedoNode.physicsBody!.collisionBitMask = ColliderType.alien.rawValue 

ensuite pour détecter une collision entre le navire et un mete le code suivant est ce que j'utilise:

if contact.bodyA.categoryBitMask == ColliderType.object.rawValue || contact.bodyB.categoryBitMask == ColliderType.object.rawValue 

Une collision entre le navire et le carburant que j'utilise:

if contact.bodyA.categoryBitMask == ColliderType.fuel.rawValue || contact.bodyB.categoryBitMask == ColliderType.fuel.rawValue { 

Puis, finalement, une collision entre une torpille et alien j'utiliser ce code:

if contact.bodyA.categoryBitMask == ColliderType.alien.rawValue || contact.bodyB.categoryBitMask == ColliderType.torp.rawValue { 

Tout fonctionne parfaitement mais je suis en train maintenant de détecter une collision entre le navire et étranger et je ne peux pas travailler sur la façon d'aller à propos de le faire. Je dois essayer de comprendre la logique et nettoyer ce code.

+0

Qu'est-ce que vous avez comme « ColliderType » est juste une catégorie de physique. Définir une catégorie sur collisionBitMask et contactTestBitMask n'a pas vraiment de sens. –

+0

Il ya beaucoup de réponses ici sur SO qui expliquent ce qui vous intéresse: http://stackoverflow.com/a/39064710, http://stackoverflow.com/a/31111039 etc ... – Whirlwind

+1

Tout d'abord, prenez votre tête la différence entre ** contacts ** et ** collisions ** et commencer à utiliser la terminologie correcte - vous ne détectez pas les collisions, vous détectez * contacts * .- http://stackoverflow.com/documentation/sprite-kit/6261/sknode-collision/29294/différence-entre-contacts-et-collisions # t = 201703220900020381008 –

Répondre

2

Si vous voulez que votre code soit informé lorsque les contacts de navires (pas de collision) soit un mete, le carburant ou un étranger, vous devriez avoir:

ship.physicsBody!.contactTestBitMask = ColliderType.object.rawValue | ColliderType.fuel.rawValue | ColliderType.alien.rawValue 

-à-dire le test de contact bitmask est égale à object OU fuel OU alien. Jetez un coup d'œil à ce simple projet Sprite-Kit ici sur SO avec contacts, collisions, événements tactiles et une fonction d'assistance (checkPhysics()) qui analysera votre configuration physique - cette fonction peut être lue dans n'importe quel projet de sprite-Kit et appelée à montrer quels contacts et quelles collisions se produiront entre quels corps de physique.

Attack button in SpriteKit

Informations complémentaires:

Il faut se rappeler que, sauf indication contraire, tout entre en collision avec tout le reste et rien rien contacts.

dire collisonBitMask de chaque nœud est réglé sur tous les 1 s et son contactTestbitMask est réglé sur tous les 0 s.

contacts ou des collisions entre nodeA et nodeB peuvent être activés hors utilisant:

nodeA.physicsBody?.collisionBitMask &= ~nodeB.category 

Nous logiquement et Bitmask de nodeA avec l'inverse (pas logique, l'opérateur ~) de la catégorie de bitmask de NoeudB « éteindre 'BitMask de bitA.

contacts ou des collisions entre nodeA et NoDec peuvent être activés ON à tout moment en utilisant:

nodeA.physicsBody?.contactTestBitMask |= nodeC.category 

Nous logiquement et Bitmask de nodeA avec la catégorie de bitmask de NoDec à 'allumer' que peu dans Bitmask de nodeA.

Vous pouvez vous assurer que toutes les formes « rebondit sur » un bord de l'écran comme suit:

// Make sure everything collides with the screen edge 
enumerateChildNodes(withName: "//*") { node, _ in 
    node.physicsBody?.collisionBitMask |= self.edgeCategory //Add edgeCategory to the collision bit mask 
} 
+0

J'ai ajouté ColliderType.alien.rawValue au masque de bits de contact de navires. Serais-je alors utiliser si contact.bodyA.categoryBitMask == ColliderType.alien.rawValue || contact.bodyB.categoryBitMask == ColliderType.alien.rawValue {? J'ai essayé quelques combinaisons, mais cela dérange habituellement les autres contacts. –

+0

@Alex - oui, mais si vous voulez éviter toutes ces choses 'if..then' et bodyA et bodyB, regardez ceci pour une façon plus simple d'implémenter didBegin (contact :) - http://stackoverflow.com/ documentation/kit de sprite/6261/sknode-collision/24159/alternative-didbegincontact # t = 201703221158558453557 –