我正在创建一个小型游戏,球需要在上,左,右壁反弹,而一旦碰到地板就应该停止。
我已经有一个有效的联系检测代码和委托,可以在正确的情况下和正确的时间调用它。
在func didBegin(_ contact: SKPhysicsContact)
中找到的碰撞点中创建一个小圆圈会在正确的位置创建节点。
我用相同的方法叫ball.physicsBody?.velocity = .zero
和ball.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
}
我希望球在仍然触地的同时停下来,而不是在弹跳后停下来。