SpriteKit接触检测略有延迟

时间:2019-04-28 14:33:46

标签: ios swift sprite-kit collision-detection

我正在创建一个小型游戏,球需要在上,左,右壁反弹,而一旦碰到地板就应该停止。

我已经有一个有效的联系检测代码和委托,可以在正确的情况下和正确的时间调用它。 在func didBegin(_ contact: SKPhysicsContact)中找到的碰撞点中创建一个小圆圈会在正确的位置创建节点。

我用相同的方法叫ball.physicsBody?.velocity = .zeroball.position = contact.contactPoint,球正确停了下来。问题在于,有时球在已经反弹到地板上后,会停下来太迟了。

该球的恢复力为1,因为我希望它反弹时不会减速,除非触地。

我已经尝试将位置设置为零,将速度设置为零,并将其isDynamic属性设置为false。这些尝试中的每一个都完成了应该做的事情,但是有时它发生的时间太晚了。 球和地板的usesPreciseCollisionDetection属性都设置为true

如果我尝试添加一些人为的延迟,则会再次调用contact方法(破坏了游戏的一部分)。

这是我的球节点的代码:

class Ball: SKSpriteNode {
    convenience init() {
        self.init(imageNamed: "earth")

        physicsBody = SKPhysicsBody(circleOfRadius: 12.5)
        physicsBody?.usesPreciseCollisionDetection = true
        physicsBody?.categoryBitMask = Masks.ball
        physicsBody?.contactTestBitMask = Masks.floor
        physicsBody?.allowsRotation = false
        physicsBody?.restitution = 1
        physicsBody?.friction = 0
        physicsBody?.angularDamping = 0
        physicsBody?.linearDamping = 0
    }
}

这是我的didBegin方法的代码:

func didBegin(_ contact: SKPhysicsContact) {
    ball.physicsBody?.velocity = .zero
    ball.position = contact.contactPoint
}

我希望球在仍然触地的同时停下来,而不是在弹跳后停下来。

0 个答案:

没有答案