7

Ich habe in den letzten zwei Tagen gekämpft, um zwei SKSpriteNodes zu bekommen, die eine Kollision registrieren und an didBegin#contact erinnern.iOS Swift didBeginContact wurde nicht aufgerufen

Ich habe ihre Bitmasken 'categoryBitMask', 'contactTestBitMask' und 'collisionTestBitMask' für beide Objekte eingestellt.

Ich habe auch die ‚dynamic‘ Eigenschaft für beide ‚true‘ gesetzt

initPhysics() scheint die Physics World in Ordnung einzurichten.

Alles, was ich erwartet habe, ist, dass didBegin#Contact genannt wird, aber es ist nicht

//Set up Physicsbody bit masks 
let playerCarBitMask: UInt32 = 0x1 << 1 
let slowCarBitMask: UInt32 = 0x1 << 2 



//initPhysics 
func initPhysics() { 
    println("((((((((((((((Initiating Physicsbody))))))))))))))") 
    self.physicsWorld.contactDelegate = self 
    self.physicsWorld.gravity = CGVector.zeroVector 

    println("self.physicsWorld.contactDelegate = \(self.physicsWorld.contactDelegate)") 

} 

//setupPlayer 
func setupPlayer() { 

    car = SKSpriteNode(imageNamed: "redCarUp") 
    car.setScale(2.0) 
    car.position = CGPoint(x: 800, y: 400) 
    car.zPosition = 100 
    car.name = "car" 

    gameNode.addChild(car) 

    let carBody = SKPhysicsBody(
     rectangleOfSize: car.frame.size, center: car.position) 

    carBody.dynamic = true 
    carBody.categoryBitMask = playerCarBitMask 
    carBody.contactTestBitMask = slowCarBitMask 
    carBody.mass = 5 
    carBody.collisionBitMask = slowCarBitMask 
    car.physicsBody = carBody 

    println("carBody = \(carBody)") 
    println("carBody.dynamic = \(carBody.dynamic)") 
    println("carBody.mass = \(carBody.mass)") 
    println("carBody.categoryBitMask = \(carBody.categoryBitMask)") 
    println("carBody.contactTestBitMask = \(carBody.contactTestBitMask)") 
    println("carBody.collisionBitMask = \(carBody.contactTestBitMask)") 



    slowCar = SKSpriteNode(imageNamed: "blueCarUp") 
    slowCar.setScale(2.0) 
    let slowCarScenePos = CGPoint(
     x: 680, 
     y: 2048) 


    slowCar.position = gameNode.convertPoint(slowCarScenePos, fromNode: self) 
    println("slowCar.position = \(slowCar.position) ****") 
    slowCar.zPosition = 80 
    slowCar.name = "slowCar" 



    let slowCarBody = SKPhysicsBody(
     rectangleOfSize: slowCar.frame.size, center: slowCar.position) 


    println("slowCar = \(slowCar) ****") 

    slowCarBody.dynamic = true 
    slowCarBody.categoryBitMask = slowCarBitMask 
    slowCarBody.contactTestBitMask = playerCarBitMask 
    slowCarBody.mass = 5 
    slowCarBody.collisionBitMask = playerCarBitMask 
    slowCar.physicsBody = slowCarBody 
    gameNode.addChild(slowCar) 



} 

func didBeginContact(contact: SKPhysicsContact!) { 
    println("*******************PhysicsContact********************") 
} 
+1

Codedumps werden auf dieser Plattform nicht geschätzt. – Mundi

+0

Beachten Sie, dass ** sowie collisionBitMask, Sie müssen contactTestBitMask ** festlegen. Das ist das übliche Gotchya. Beachten Sie, dass ** im Storyboard-Editor contactTestBitMask standardmäßig auf Null gesetzt wird ** - das ist das übliche Problem. setze es einfach auf "1" – Fattie

Antwort

2

Es stellte sich heraus, dass es sich um ein einfaches Problem handelte. In meinem ursprünglichen Code wie so war ich Parameter für die SKPhysicsBody Detektierrahmen Einstellung:

let carBody = SKPhysicsBody( rectangleOfSize: car.frame.size, center: car.position)

Ebenso wurde ich für den zweiten Knoten das gleiche zu tun, dass ich für Physik Kollisionen zu testen.

einfach das Entfernen ‚Zentrum:‘ Parameter wie folgt:

let carBody = SKPhysicsBody(rectangleOfSize: car.frame.size)

für die beiden Sprite-Knoten löste das Problem und die Knoten nun ineinander abstürzen und sich zur Seite schieben, wie erwartet.

3

Wenn Sie einen Kontakt zwischen dem Auto machen wollen und slowCar Sie die categoryBitMask beider physicsBodies init haben (ich glaube, du hast). Sehen Sie den Code unten, um Kontakt zwischen zwei physicsBodies zu bekommen. Wenn ein Kontakt vorhanden ist, wird die Anzeigefunktion angezeigt:

//init your categoryBitMask : 
let carCategory:UInt32 = 0x1 << 0 
let SlowCarCategory:UInt32 = 0x1 << 1 


//init car 
car.physicsBody?.categoryBitMask = carCategory 
car.physicsBody?.contactTestBitMask = slowCarCategory 

//init slowCar 
slowCar.physicsBody?.categoryBitMask = slowCarCategory 
slowCar.physicsBody?.contactTestBitMask = CarCategory 

// set your contact function 
func didBeginContact(contact: SKPhysicsContact!) 
{ 
    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 
    } 


    if ((firstBody.categoryBitMask & carCategory) != 0 && (secondBody.categoryBitMask & slowCarCategory) != 0) 
    { 
     displayfunction(firstBody.node as SKSpriteNode, car: secondBody.node as SKSpriteNode) 
    } 
} 

func displayFunction (slowCar : SKSpriteNode, car : SKSpriteNode) 
+0

funktioniert es für dich? – Haox

+0

Danke, leider wurde didBeginContact() überhaupt nicht aufgerufen. Ich habe gerade den ganzen Code entfernt, so dass er nur die Sprites auf den Bildschirm bringt, die Physik-Engine einrichtet und dann eine Aktion ausführt, um die andere zu treffen, aber leider funktioniert sie immer noch nicht. – Headstock67

+0

Legen Sie die Kategorie "BitMask" von "Auto" und "SlowCar" fest? In deinem Code hast du 'carBody' und' slowCarBody' gesetzt. – Haox

0

Hinweis Bitte, dass der Kontakt nicht zwischen zwei statischen Körper

(node.physicsBody?.isDynamic = false) 
8

'didBeginContact' wurde geändert, um 'didBegin' in schnellen 3

func didBegin(_ contact: SKPhysicsContact) { //stuff }

nachgewiesen werden, hatte ich einen Code aus swift 2 und 'didBeginContact' saß dort, wurde aber nicht angerufen. Nach ganzem Weiß habe ich herausgefunden, dass die Funktion geändert wurde. Also dachte ich, meine Antwort könnte jemandem helfen.

Verwandte Themen