设置最小滚动速度

时间:2018-10-24 21:08:37

标签: ios swift sprite-kit skspritenode skphysicsbody

我有一个球,我向空中射击:

enter image description here

它的初始化方式如下:

func initBallNode() {
    // TODO: Create ball node
    ballNode = SKSpriteNode(imageNamed: "Ball1") // Create a ball
    ballNode.zPosition = ZPositions.ball
    let offsetFromCorner: CGFloat = 20 // Offset from bottom-left of screen
    ballNode.position = CGPoint(x: frame.minX + ballNode.size.width / 2 + offsetFromCorner, y: frame.minY + ballNode.size.height / 2 + offsetFromCorner)
    ballNode.physicsBody = SKPhysicsBody(circleOfRadius: ballNode.size.width / 2)
    ballNode.physicsBody?.affectedByGravity = true
    ballNode.physicsBody?.angularDamping = 1 // <-- Does not set a minimum-speed

    addChild(ballNode)
}

如何降低球的最小速度/速度,使球滚动得更少,更早地达到完全停止

在不影响物体质量(使物体掉落得更早)的情况下,是否有物理性质可以处理?


如有任何疑问,请询问!

2 个答案:

答案 0 :(得分:0)

您可以增加friction中的physicsBody。默认情况下,摩擦值为0.2,但范围可能为0.0到1.0

答案 1 :(得分:0)

这仍然不是答案。此问题仍然存在,如原始答案下方的修改所述。


由于stored properties in Swift extensions not being allowed(在Objective-C中产生了一点点),因此变得相当困难。但是,经过一些研究和测试之后,我提出了目前可以正常使用的解决方案:

import SpriteKit


// Key to access the stored properties
private var minimumSpeedAssociatedKey: UInt8 = 0

extension SKPhysicsBody {

    // Minimum speed for each node
    var minimumSpeed: CGFloat? {
        get { return objc_getAssociatedObject(self, &minimumSpeedAssociatedKey) as? CGFloat }
        set(newValue) { objc_setAssociatedObject(self, &minimumSpeedAssociatedKey, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN) }
    }

    // Update the speed for each node
    func updateSpeed() {
        guard let safeMinimumSpeed = minimumSpeed else {
            assert(false, "You have tried to update an object speed, without setting the minimum for the node: \"\(self.node?.description ?? "Unavailable")\".")
        }
        let currentSpeed = sqrt(pow(velocity.dx, 2) + pow(velocity.dy, 2))
        if currentSpeed < safeMinimumSpeed && currentSpeed > 0 {
            angularVelocity = 0
            velocity = CGVector(dx: 0, dy: 0)
        }
    }

}

将其放在项目的Swift文件中。然后,您可以设置最低速度:

ballNode.physicsBody?.minimumSpeed = 30

然后,像这样覆盖更新功能:

override func didFinishUpdate() {
    ballNode.physicsBody?.updateSpeed()
}

结果,球现在不再滚动到低于30的速度,而是停止了。停止仍然几乎没有引起注意,因为之前的球在5秒内的运动非常缓慢。这是我一直在寻找的结果。

我希望这对人们有所帮助,如果您找到了更好的解决方案(或Apple添加了新资产),请发表您自己的答案。 :)


编辑1:

我现在的地形变化很大。但是,当球撞到山丘时回滚时,这会引起奇怪的物理现象。因此,这不是一个完全解决的问题。