斯威夫特:设定距离的速度

Ser*_*iza 7 game-physics ios skphysicsbody swift

我正在尝试在Swift上创建一个移动平台,为了让玩家与平台一起移动,我需要self.moveByX()physicsBody?.velocity(更简单)更改为(并为平台和玩家添加一些摩擦).

所以,我做了这样的函数:

self.runAction(
    SKAction.repeatActionForever(
        SKAction.sequence([
            SKAction.runBlock({
                print(self.position.x)
                self.physicsBody?.velocity = CGVectorMake(20, 0.0)
            }),
            SKAction.waitForDuration(3),
            SKAction.runBlock({
                print(self.position.x)
                self.physicsBody?.velocity = CGVectorMake(-20, 0.0)
            }),
            SKAction.waitForDuration(3)
        ])
    )
)
Run Code Online (Sandbox Code Playgroud)

问题是我预计这些位置之间的差异正好是60(20*3s),但我收到平台x位置的日志,如下所示:

596.042907714844
544.228393554688
596.048950195312
544.234008789062
596.054565429688
544.116333007812
595.936584472656
544.121887207031
595.942199707031
544.127685546875
595.824584960938
544.009704589844
Run Code Online (Sandbox Code Playgroud)

所以,位置之间的差异在51~52之间

如何通过改变速度使平台在特定和精确的距离内移动?

编辑:我不知道这是否相关,但我已经设置了这个平台的物理体:

self.physicsBody = SKPhysicsBody(rectangleOfSize: self.size)
self.physicsBody?.categoryBitMask = PhysicsCategory.Ground
self.physicsBody?.contactTestBitMask = PhysicsCategory.Player
self.physicsBody?.collisionBitMask = PhysicsCategory.Player
self.physicsBody?.allowsRotation = false
self.physicsBody?.affectedByGravity = false
self.physicsBody?.dynamic = true
self.physicsBody?.friction = 1.0
self.physicsBody?.restitution = 0.0
self.physicsBody?.mass = 99999999999
Run Code Online (Sandbox Code Playgroud)

Oli*_*son 2

我以前没有使用过 Sprite Kit,但我认为你的问题是 SKPhysicsBody 的 LinearDamping 属性默认设置为 0.1,快速计算 (20*3-20*3*0.1 = 54) 这听起来不错如果速度每帧都被阻尼。

以下是该属性的文档:

https://developer.apple.com/library/ios/documentation/SpriteKit/Reference/SKPhysicsBody_Ref/index.html#//apple_ref/occ/instp/SKPhysicsBody/linearDamping

编辑:我认为我至少应该检查我的答案,所以我写了一个快速(粗略)程序:

var dampingOccurancesPerSecond = 60.0 //Corresponds to frame rate
var numberOfSeconds = 3.0
var time = 0.0

@IBAction func test(sender: UIButton) {
    let result = checkDistanceForVelocity(20, damping: 0.1, distanceTraveled: 0.0)
    print(result)
}

 func checkDistanceForVelocity(velocity: Double, damping: Double, distanceTraveled: Double) -> Double {

    if time < numberOfSeconds {

        time += 1/dampingOccurancesPerSecond

        let newVelocity = velocity - (velocity * damping/dampingOccurancesPerSecond)

        let newDistance = (distanceTraveled + velocity/dampingOccurancesPerSecond)

        return checkDistanceForVelocity(newVelocity, damping: damping, distanceTraveled: newDistance)

    }

    return distanceTraveled

}
Run Code Online (Sandbox Code Playgroud)

您的行驶距离的微小变化也可能是由于帧速率的微小变化造成的。当dampingOccurancesPerSecond从60变化到50时,行驶的总距离从52.1203109538336变化到51.8808576268828

希望这有帮助!