Swift 正确使用加速度计

Swift 正确使用加速度计,swift,sprite-kit,accelerometer,Swift,Sprite Kit,Accelerometer,我使用加速度计作为我游戏的转向机构。它通常工作正常,但偶尔会表现得很奇怪。随机出现大量输入延迟,我做的每一次旋转都有一段时间没有注册。在某些情况下,两个命令之间可能会有很多延迟,导致我的角色在一个方向上漂移太久。这是由于游戏延迟还是我的代码出错?下面是我的代码 actionMoveLeft = SKAction.moveBy(x: -3, y: 0, duration: 0.1) actionMoveRight = SKAction.moveBy(x: 3, y: 0, durat

我使用加速度计作为我游戏的转向机构。它通常工作正常,但偶尔会表现得很奇怪。随机出现大量输入延迟,我做的每一次旋转都有一段时间没有注册。在某些情况下,两个命令之间可能会有很多延迟,导致我的角色在一个方向上漂移太久。这是由于游戏延迟还是我的代码出错?下面是我的代码

   actionMoveLeft = SKAction.moveBy(x: -3, y: 0, duration: 0.1)
    actionMoveRight = SKAction.moveBy(x: 3, y: 0, duration: 0.1)
    self.addChild(ship)
    if motionManager.isAccelerometerAvailable == true {
        motionManager.startAccelerometerUpdates(to: OperationQueue.current!, withHandler:{
            data, error in
            if (data!.acceleration.y) < -0.05 {
                self.ship.run(self.actionMoveLeft)
            }

            else if data!.acceleration.y > 0.05 {
                self.ship.run(self.actionMoveRight)
            }

        })

    }
actionMoveLeft=SKAction.moveBy(x:-3,y:0,持续时间:0.1)
actionMoveRight=SKAction.moveBy(x:3,y:0,持续时间:0.1)
self.addChild(船)
如果motionManager.isAccelerometerAvailable==true{
motionManager.startAccelerometerUpdates(到:OperationQueue.current!,withHandler:{
数据错误
如果(数据!.acceleration.y)<-0.05{
self.ship.run(self.actionMoveLeft)
}
否则,如果数据!.加速度.y>0.05{
self.ship.run(self.actionMoveRight)
}
})
}

不保证加速计会以0.1秒的定期间隔为您提供更新(假设您的CMMotionManager实例的deviceMotionUpdateInterval属性设置为0.1)。当每个动作都以离散的时间间隔执行时,SKActions工作正常。但由于加速计提供不规则的间隔更新,您可能会同时执行更多操作

一个简单的解决方法是每次删除之前的操作:

if (data!.acceleration.y) < -0.05 {
    self.ship.removeAction(forKey: "Move")
    self.ship.run(self.actionMoveLeft, withKey: "Move")
}
如果你不想使用物理体,因为你只是在用你的自定义函数处理物理,那么我建议你在每一帧手动计算飞船的位置

// Inside the update method, assuming you have saved the acceleration vector
// and you have a deltaTime variable that holds the difference of time
// elapsed from the previous update
self.ship.physicsBody.velocity = CGVector(dx: self.ship.physicsBody.velocity.dx + CGFloat(acceleration.x * deltaTime), dy: self.ship.physicsBody.velocity.dy + CGFloat(acceleration.y * deltaTime))