首页 > 解决方案 > SpriteKit 接触检测有轻微延迟

问题描述

我正在创建一个小游戏,球需要在上、左和右墙上反弹,而它应该在触地时立即停止。

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

在我调用的相同方法ball.physicsBody?.velocity = .zeroball.position = contact.contactPoint,球正确地停止了。问题是,有时球已经从地板上弹起后,太晚才停下来。

球的恢复值为 1,因为我希望它在不减速的情况下反弹,除非在触地时。

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

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

这是我的球节点的代码:

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
}

我希望球在仍然接触地板时停止,而不是在它已经反弹后的一帧。

标签: iosswiftsprite-kitcollision-detection

解决方案


推荐阅读