2016-04-21 58 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關於位掩碼和他們如何工作/應該使用。