2016-11-14 3 views

Antwort

4

Die Kategorie-Bitmaske teilt Sprite-Kit mit, um was für ein Objekt es sich handelt. Die Kollisions-Bitmaske teilt Sprite Kit mit, mit welchen Objekten dieses Objekt kollidiert (d. H. Trifft und springt ab). Die Bitmaske "ContactTest" teilt Sprite-Kit mit, mit welchen Kontakten Sie benachrichtigt werden möchten, d. H. Wenn dieses Objekt ein anderes Objekt berührt.

Kollisionen werden automatisch von der Sprite-Kit Game Engine behandelt; Kontakte werden von Ihrem Code bearbeitet - wenn ein Kontakt passiert, an dem Sie interessiert sind, wird Ihr Code (didBeginContact' für Swift 2, 'didBegin(contact:) für Swift 3) aufgerufen.

Sie müssen sich diese im Binärformat vorstellen und zur Vereinfachung beginnen wir mit einfachen Kategoriebitmasken, wobei jedes Objekt in Ihrer Szene nur einer Kategorie angehört.

z. In deiner Szene hast du einen Spieler, eine Spieler-Rakete, einen Feind und den Bildschirmrand. Wir nehmen an, dass die Bitmasken 8-Bit statt 32-Bit sind. Denken Sie an jede Nummer als ein Bereich von 8 Ziffern (8 Bit), von denen jeder eine 0 oder 1

Die Objekte in der Szene eindeutigen Kategorien haben haben, so dass wir sie wie folgt vergeben:

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

Wenn Sie Zahlen verwenden, die im Dezimalsystem eine andere Potenz als 2 haben (1, 2, 4, 8, 16, 32, 65, 128 usw.), wird in der Kategorie mehr als 1 Bit gesetzt Bitmaske, die die Dinge verkompliziert (es bedeutet, dass dieses Objekt zu mehreren Kategorien gehört) und Ihr Code muss komplizierter werden.

Jetzt überlegen, was abprallt (die Kollisionen). Nehmen wir an, alles springt von allem anderen ab, außer dass die Rakete durch den Bildschirmrand geht.

der Kollision Bitmasken für jedes Objekt der Bits besteht, die die Objekte darstellen, dass dieses Objekt mit dh kollidiert.

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) 

Jetzt denken wir über die Wechselwirkungen Objekt wir interessiert sind Wir wollen wissen, wann :

  • Spieler und Feind Berührung
  • Feind und Spieler berühren oder den Feind und den Raketen Berührung des Spielers.

Diese dargestellt wird durch:

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

Beachten Sie, wenn Sie wissen wollen, wenn A und B berühren, es ist eine nur zu haben, reicht die contactTestBitMask (CTBM) B categoryBitMask aufzunehmen; Sie müssen B's CTBM auch nicht auf A's Kategorie setzen. Wenn Sie jedoch möchten, dass sie sich gegenseitig abprallen, muss die collisionBitMask jedes Objekts die Kategorie bitMask des anderen enthalten. Wenn A's collisonbitMask die B-Kategorie enthält, aber nicht umgekehrt, wenn A kollidiert, wird A abprallen, aber B wird nicht beeinflusst.

Für Ihr spezifisches Beispiel, (Kategorie Maske bis 32 und Kollisionsmaske bis 11), ist die KategorieBitMask 32, die 00100000 ist (mit nur 8 Bit kleben).Die collisionBitMask ist 11, was 8 + 4 + 1 ist, also binär "00001101", was bedeutet, dass es mit Objekten mit einer categoryBitMask von 8, 4 oder 1 kollidiert, also nehme ich an, dass es Objekte in dieser Szene mit diesen categoryBitMasks gibt.

Standardmäßig springt alles von allem anderen ab, d. H. Die collisionBitMask ist alles "1", d. H. B'111111 .. 'und nichts meldet Kontakte mit irgendetwas anderem, d. H. ContactTestBitMask ist alles' Nullen.

Auch - all dies gilt für physicsBodies, nicht Knoten.

+0

Ich drucke das und ziehe es aus einem Kleiderbügel, der es vor mir hält, während ich herum laufe. Esel, die Karotte suchen. – Confused

+0

Ich plane, einen Dokumentationsbeitrag zu diesem Thema zu machen und dann einen weiteren, um mehrere Kategorien für ein Objekt zu verwenden und wie man einzelne KontaktTest- und Kollisions-Bits abschaltet und anschaltet (zB hat der Spieler die goldene Münze gesammelt, also kontaktiert keine blauen Monster für 10 Sekunden). –

+0

Es ist schade, dass es keine bessere Plattform für diese Art von Einsicht und Weisheit gibt, und dass es SO gelungen ist, die SO.docs auf jede mögliche Art und Weise zu verpfuschen, und andere Möglichkeiten, die ich nicht wirklich für möglich hielt. – Confused

Verwandte Themen