amazingjr
amazingjr

Reputation: 13

didBeginContact not being called

I'm trying to create a program that prints out something whoever my spaceship goes over a circle, but it's not printing anything when I put the spaceship over the circle. Did I build my didBeginContact method wrong? Did I set up the BitMasks wrong?

import SpriteKit

class GameScene: SKScene {
    var spaceship: SKNode!
    var circ: SKNode!
    override func didMoveToView(view: SKView) {
        self.physicsWorld.gravity = CGVector(dx: 0, dy: 0)
        spaceship = SKSpriteNode(imageNamed: "Spaceship")
        spaceship.setScale(0.4)
        spaceship.position.x = self.frame.width/2
        spaceship.position.y = spaceship.frame.height/2
        spaceship.physicsBody = SKPhysicsBody(circleOfRadius: spaceship.frame.height/2)
        spaceship.physicsBody?.categoryBitMask = 1
        spaceship.physicsBody?.contactTestBitMask = 2
        spaceship.physicsBody?.collisionBitMask = 0
        spaceship.physicsBody?.dynamic = true

        circ = SKShapeNode(circleOfRadius: 50)
        circ.position.y = self.frame.height/2
        circ.position.x = self.frame.width/2
        circ.physicsBody = SKPhysicsBody(circleOfRadius: 50)
        circ.physicsBody?.categoryBitMask = 2
        circ.physicsBody?.contactTestBitMask = 1
        circ.physicsBody?.collisionBitMask = 0
        circ.physicsBody?.dynamic = true
        self.addChild(circ)
        self.addChild(spaceship)
    }

    func didBeginContact(contact: SKPhysicsContact){
        println("colliding!")
    }

    override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
        for touch: AnyObject in touches {
            let location = touch.locationInNode(self)
            spaceship.position = location
        }
    }

    override func touchesMoved(touches: NSSet, withEvent event: UIEvent) {
        for touch: AnyObject in touches {
            let location = touch.locationInNode(self)
            spaceship.position = location
        }
    }
}

Upvotes: 1

Views: 927

Answers (1)

Nate Cook
Nate Cook

Reputation: 93296

You need to declare yourself as the contact delegate of your physics world:

// add conformance to SKPhysicsContactDelegate:
class GameScene: SKScene, SKPhysicsContactDelegate {
    // ...
    override func didMoveToView(view: SKView) {
        self.physicsWorld.gravity = CGVector(dx: 0, dy: 0)

        // set as delegate:
        self.physicsWorld.contactDelegate = self

        // ..
    }

    // should be called now
    func didBeginContact(contact: SKPhysicsContact){
        println("colliding!")
    }
}

Upvotes: 2

Related Questions