2016-04-21 79 views
1

我测试了一个简单的场景。SpriteKit的didBeginContact不能被调用

Func didBeginContact不能被调用。

我尝试使用collisionBitMasks1.physicsBody = SKPhysicsBody(circleOfRadius: 100)。问题持续存在。

我能做些什么来解决它?

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") 
    } 
} 
+0

还有一些东西有关实施'didBeginContact'方法的内部接触检测:http://stackoverflow.com/a/36246855/3402095,http://stackoverflow.com/a/27389834/3402095, http://stackoverflow.com/a/20604762/3402095 – Whirlwind

回答

0

找出原因。需要使用

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

这不是原因(至少对于给定的代码),因为默认情况下'dynamic'属性设置为true https://developer.apple.com/library/IOS /文档/ SpriteKit /参考/ SKPhysicsBody_Ref /#// apple_ref/OCC/instp/SKPhysicsBody /动态 – Whirlwind

1

你的代码是相当多的都错了,但你的罪犯:

physicsWorld.speed = 0 

从文档:

的默认值是1.0,这意味着模拟运行在正常速度为 。默认值以外的值会更改 在物理模拟中通过的速率。例如,速度值2.0 表示物理模拟中的时间通过场景模拟时间的两倍。值为0.0会暂停模拟的物理效果 。

因此将其设置为0.0会暂停仿真。第二个问题是您的节点受重力影响,但您使用SKAction移动它们。这样你就可以将节点拉出物理模拟,并且你可能会体验到奇怪的行为。

另外,我会建议阅读this great StackOverflow post关于位掩码和他们如何工作/应该使用。