yao.h yao
yao.h yao

Reputation: 171

SpriteKit's didBeginContact can't be called

I tested with a simple scene.

Func didBeginContact can't be called.

I have try to use collisionBitMask and s1.physicsBody = SKPhysicsBody(circleOfRadius: 100). The problem was persistent.

What can I do to fix it?

import SpriteKit

class Test2Scene: SKScene, SKPhysicsContactDelegate {
    override func didMoveToView(view: SKView) {
        physicsWorld.contactDelegate = self
        physicsWorld.speed = 0


        let s1 = SKSpriteNode(imageNamed: kImagePlayer)
        s1.position = CGPointMake(100, 100)
        s1.physicsBody = SKPhysicsBody(rectangleOfSize: s1.size)
        s1.physicsBody?.categoryBitMask = 1
        s1.physicsBody?.contactTestBitMask = 2
        //s1.physicsBody?.collisionBitMask = 2
        self.addChild(s1)


        let s2 = SKSpriteNode(imageNamed: kImagePlayer)
        s2.position = CGPointMake(100, 500);
        s2.runAction(SKAction.moveToY(0, duration: 1))
        s2.physicsBody = SKPhysicsBody(rectangleOfSize: s2.size)
        s2.physicsBody?.categoryBitMask = 2
        //s2.physicsBody?.collisionBitMask = 1
        self.addChild(s2);

        print("view did load")
    }

    func didBeginContact(contact: SKPhysicsContact) {
        print("aaa")
    }
    func didEndContact(contact: SKPhysicsContact) {
        print("bbb")
    }
}

Upvotes: 1

Views: 213

Answers (2)

yao.h yao
yao.h yao

Reputation: 171

Find out the reason. Need use

s1.physicsBody!.dynamic = true
s2.physicsBody!.dynamic = true

Upvotes: 0

Whirlwind
Whirlwind

Reputation: 13665

Your code is pretty much all wrong, but your offender is :

physicsWorld.speed = 0

From the docs:

The default value is 1.0, which means the simulation runs at normal speed. A value other than the default changes the rate at which time passes in the physics simulation. For example, a speed value of 2.0 indicates that time in the physics simulation passes twice as fast as the scene’s simulation time. A value of 0.0 pauses the physics simulation.

So setting it to 0.0 pauses the simulation. Second problem is that your nodes are affected by gravity but you move them using SKAction. That way you are pulling the node out of physics simulation and you may experience weird behaviours.

Also I would recommend to read this great StackOverflow post about bitmasks and how they work / should be used.

Upvotes: 1

Related Questions