2016-06-17 11 views
0

In meinem Spiel benutze ich SKSprite. Einige Kollisionen werden nicht erkannt. Ich habe 10 Versuche gemacht, Kollisionen funktionieren gut, aber etwa 25% der Kollisionen, die erkannt werden sollen, werden nicht erkannt. Ich habe keine Ahnung warum, ich habe viele Dinge ausprobiert. Kollisionen sind nur mit Knoten der gleichen Kategorie.Swift - Zufällige Kollisionen werden nicht erkannt

Ich habe keine Ahnung, warum zufällig einige Kollisionen nicht gemacht werden, wenn ich sie offensichtlich sehen kann, haben Sie eine Idee? Danke für Ihre Hilfe. Hier

ist der Code von didBeginContact:

func didBeginContact(contact: SKPhysicsContact) { 

    var firstBody: SKPhysicsBody = contact.bodyA 
    var secondBody: SKPhysicsBody = contact.bodyB 

    if firstBody.categoryBitMask == secondBody.categoryBitMask { 

      listContacts.append([firstBody.node!,secondBody.node!]) 
     } 

    } 
} 

Hier ist der Code von didEndContact:

func didEndContact(contact: SKPhysicsContact) { 

    var firstBody: SKPhysicsBody = contact.bodyA 
    var secondBody: SKPhysicsBody = contact.bodyB 

    if contact.bodyA.categoryBitMask == contact.bodyB.categoryBitMask { 

     for i in listContacts{ 

      if (i.contains(firstBody.node!) && i.contains(secondBody.node!)){ 

       let findIndex = listContacts.indexOf { $0 == i } 
       listContacts.removeFirst(findIndex!) 
      } 
     } 

    } 

Schließlich, wenn ich ein neues SKSpriteNode erkläre ich diesen Satz:

rectangle.physicsBody = SKPhysicsBody(rectangleOfSize: rectangle.size) 
rectangle.physicsBody?.dynamic = true 
rectangle.physicsBody?.collisionBitMask = PhysicsCategory.None 

usesPreciseCollisionDetection = true ändert nichts, daher verwende ich usePrecisionCollisionDetection nicht

Jeder SKSpriteNode hat seine KategorieBitmask und contactTestBitmask gleich, weil nur dieselben SKSpriteNodes kollidieren sollen.

auch:

physicsWorld.gravity = CGVectorMake(0, 0) 
physicsWorld.contactDelegate = self 

Schließlich ist hier ein kurzes Video von meinem Spiel, wenn Sie leicht verstehen wollen, was passiert (Problem der Kollisionen zwischen Rechtecke) https://www.youtube.com/watch?v=-pbmKwQiE9U

+0

Können Sie bitte Ihre Touchfunktionen posten? Es sieht so aus, als würdest du in dein Video tippen, um die Blöcke zu entfernen, richtig? – Siriss

+0

@Siriss du hast Recht, aber es ist eine riesige Funktion und ich habe viele Tests, ich weiß, es kommt von der Kollisionserkennung, weil listContacts nicht die Verbindungen, so dass ich glaube nicht, es wird leider helfen. Grundsätzlich überprüft die Touch-Funktion, welche Rechtecke mit Hilfe von listContacts daneben liegen. Wenn mindestens 3 nebeneinander die gleiche Farbe haben, verschwinden sie. – Oscar

Antwort

0

Ich habe es gerade repariert! Der Grund war, dass ich in der Funktion "touchesEnded" eine rekursive Funktion hatte, die schlechte Verbindungen in den listContacts löschte!

+0

Froh, dass Sie es gelöst haben. – Siriss

0

Sie scheinen, wenn die zu überprüft categoryBitMask des Körpers A gleich Körper B.

if firstBody.categoryBitMask == secondBody.categoryBitMask { 

     listContacts.append([firstBody.node!,secondBody.node!]) 
    } 

} 

Dies wird nur eine Aktion ausführen, wenn ein Knoten einen Knoten mit dem gleichentrifft

Sie sollten die collisionBitMasks überprüfen, um zu sehen, ob Sie eine Kollision haben, oder Sie können den Namen überprüfen.

Ein Beispiel categoryBitMask verwenden Sie so etwas wie dies tun können:

func didBeginContact(contact: SKPhysicsContact) { 

    var sprite: SKSpriteNode! 

    if contact.bodyA.categoryBitMask == <your category bitmask> { 
     sprite = contact.bodyA.node! as! SKSpriteNode 
    } 
    else if contact.bodyB.categoryBitMask == <your category bitmask> { 
     sprite = contact.bodyB.node! as! SKSpriteNode 
    } 

    // Do something with sprite.... 
    // You can also create another sprite, and assign it to the other body, and perform functions on it, or both A and B. 
    // It is good to have different functions you send can send the nodes to once you find out which ones they are. 

} 

Sie können diese Prüfungen tun, um zu sehen, welche Sprites einander schlagen.

+0

Danke für deine Antwort, ich habe es einfach ausprobiert und es deinem Code ähnlich gemacht, es ändert nichts, habe immer noch das selbe Problem. Es macht genau dasselbe, weil ich Kollisionen zwischen Knoten der gleichen KategorieBitMask erkennen muss. – Oscar

+0

Ich habe gerade ein Video zu meinem Beitrag hinzugefügt, wenn Sie sehen möchten, wie das Spiel aussieht. – Oscar