2016-04-26 12 views
1

In meinem Spiel, wenn das Spiel beginnt, sind einige Knoten bereits in Kontakt, aber ich finde nicht, wie diese Kontakte zu erkennen sind. Es gelingt mir nur, Kontakte zu erkennen, die passieren, wenn sich Knoten während des Spiels bewegen und über die Funktion didBeginContact miteinander in Kontakt treten.SpriteKit/Swift - Wie man den Kontakt von zwei Knoten überprüft, wenn sie bereits in Kontakt sind

Hat jemand eine Idee, wie Sie diese Kontakte erkennen können?

Hier ist meine didBeginContact bei Bedarf:

func didBeginContact(contact: SKPhysicsContact) { 

    var firstBody: SKPhysicsBody 
    var secondBody: SKPhysicsBody 
    if contact.bodyA.categoryBitMask == contact.bodyB.categoryBitMask { 
     firstBody = contact.bodyA 
     secondBody = contact.bodyB 

     contactsList.append([firstBody.node!,secondBody.node!]) 
    } 
} 
+0

gute Frage, ich denke, Sprite-Knoten, die ein Spiel anfassen berühren funktioniert nicht mit didBeginContact. Ich denke, deine einzige andere Option ist didEndContact, aber das scheint nicht das zu sein, was du willst. – Steve

+0

Haben Sie getestet, ob didBeginContact für 2 Körper aufgerufen wird, die sich bereits berühren? Logischerweise würde ich denken, dass beim ersten Durchlauf der Szene, wenn die Physik-Engine zwei physikalische Körper überlappt, didBeginContact aufgerufen wird. Es wird dann diese Körper zu einer Liste hinzufügen und didBeginContact nicht beim nächsten Durchlauf anrufen, wenn sie sich noch berühren, aber didEndContact aufrufen, wenn sie nicht mehr berühren und sie aus der Liste entfernen. –

+0

Vielen Dank für Ihre Antworten, leider wurde didBeginContact nicht aufgerufen. Ich habe genau so wie du gesagt! – Oscar

Antwort

1

Ich habe gerade versucht, zwei Sprites von Anfang an überlappen zu machen und Kontakt für mich erkannt. Hier ist der Code:

import SpriteKit 

struct Collider { 
    static let SmallSquare  : UInt32 = 1 << 0 
    static let BigSquare  : UInt32 = 1 << 1 
} 

class GameScene: SKScene, SKPhysicsContactDelegate { 

    override func didMoveToView(view: SKView) { 

     self.physicsWorld.contactDelegate = self 

     let smallSquare = SKSpriteNode(color: .orangeColor(), size: CGSize(width: 50, height:50)) 
     smallSquare.zPosition = 2 
     smallSquare.position = CGPoint(x: frame.midX, y: frame.midY) 
     smallSquare.physicsBody = SKPhysicsBody(rectangleOfSize: smallSquare.size) 
     smallSquare.physicsBody?.affectedByGravity = false 
     smallSquare.physicsBody?.categoryBitMask = Collider.SmallSquare 
     smallSquare.physicsBody?.contactTestBitMask = Collider.BigSquare 
     smallSquare.physicsBody?.collisionBitMask = 0 
     addChild(smallSquare) 

     let bigSquare = SKSpriteNode(color: .purpleColor(), size: CGSize(width: 200, height: 200)) 
     bigSquare.zPosition = 1 
     bigSquare.position = CGPoint(x: frame.midX, y: frame.midY) 
     bigSquare.physicsBody = SKPhysicsBody(rectangleOfSize: bigSquare.size) 
     bigSquare.physicsBody?.affectedByGravity = false 
     bigSquare.physicsBody?.categoryBitMask = Collider.BigSquare 
     bigSquare.physicsBody?.contactTestBitMask = Collider.SmallSquare 
     bigSquare.physicsBody?.collisionBitMask = 0 
     addChild(bigSquare) 

    } 

    func didBeginContact(contact: SKPhysicsContact) { 

     print("Contact detected") 
    }  
} 

Später, in geeigneter Weise Kontakt zwischen bestimmten Stellen zu erkennen, sollten Sie etwas tun:

func didBeginContact(contact: SKPhysicsContact) { 

     var firstBody, secondBody: SKPhysicsBody 

     if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask { 

      firstBody = contact.bodyA 
      secondBody = contact.bodyB 
     } else { 

      firstBody = contact.bodyB 
      secondBody = contact.bodyA 
     } 


     if ((firstBody.categoryBitMask & Collider.SmallSquare) != 0 && 
      (secondBody.categoryBitMask & Collider.BigSquare != 0)) { 

       print ("Contact detected") 
     } 

    } 

Aber auch ohne dass, wird die Nachricht gedruckt werden, wenn das Spiel ist zum ersten Mal gestartet, weil der Kontakt sowieso von der Physikwelt erkannt wird.