1

我用一个简单的场景进行了测试。

无法didBeginContact调用函数。

我尝试使用collisionBitMaskand s1.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")
    }
}
4

2 回答 2

1

你的代码几乎都是错误的,但你的罪犯是:

physicsWorld.speed = 0

从文档:

默认值为 1.0,表示模拟以正常速度运行。默认值以外的值会更改物理模拟中时间流逝的速率。例如,速度值为 2.0 表示物理模拟中的时间是场景模拟时间的两倍。值 0.0 会暂停物理模拟。

因此将其设置为 0.0 会暂停模拟。第二个问题是您的节点受重力影响,但您使用SKAction. 这样,您将节点从物理模拟中拉出来,您可能会遇到奇怪的行为。

此外,我建议阅读这篇关于位掩码以及它们如何工作/应该使用的精彩 StackOverflow 帖子。

于 2016-04-21T10:46:30.780 回答
0

找出原因。需要使用

s1.physicsBody!.dynamic = true
s2.physicsBody!.dynamic = true
于 2016-04-22T02:34:21.130 回答