SpriteKit加速度计问题



我正在使用sprite-kit制作游戏。在我的游戏中,我使用加速度计通过倾斜设备将节点一侧移到一边。以下代码运行顺利,但是在8-10游戏重新启动后,响应倾斜度有点滞后。然后,我关闭应用程序,问题会自我重复。

我在didMove(to view: SKView)中具有motionManger.startAccelerometerUpdates(),并且具有看起来像

的函数
    func processUserMotion(forUpdate currentTime: CFTimeInterval) {

    Ball.position.x += xAcceleration * 50 // xAcceleration is a variable that is a CGFloat = 0
    motionManger.accelerometerUpdateInterval = 0.1
    motionManger.startAccelerometerUpdates(to: OperationQueue.current!) { (data:CMAccelerometerData?, error:Error?) in
        if let accelerometerData = data {
            let acceleration = accelerometerData.acceleration
            self.xAcceleration = CGFloat(acceleration.x) * 0.75 + self.xAcceleration * 0.25
        }
    }

}
 override func update(_ currentTime: TimeInterval) {
     processUserMotion(forUpdate: currentTime)
 }

任何想法为什么会发生这种情况,或者是在设备倾斜到左和向右时使节点响应良好的更好方法?谢谢!

更新:

我终于弄清楚了加速度计为何落后的原因。我要做的就是将motionManger.stopAccelerometerUpdates()添加到我的游戏场景中。这样做之后,我将过渡到GamesCene 30加时间,并且响应良好!希望这个小错误将来对某人有帮助!

cmmotionmanager.startaccelermeterupdates必须用作对您的一个变量之一的引用,每次生成运动时都不必运行它。

例如在Swift 3

class GameScene: SKScene {
    private var ballNode : SKSpriteNode?
    private let manager = CMMotionManager()
    override func didMove(to view: SKView) {
        self.ballNode = self.childNode(withName: "ball") as? SKSpriteNode
        manager.startAccelerometerUpdates()
        manager.accelerometerUpdateInterval = 0.01
        manager.startAccelerometerUpdates(to: OperationQueue.current!){ (data:CMAccelerometerData?, error:Error?) in
            if let accelerometerData = data {
                let acceleration = accelerometerData.acceleration
                self.ballNode?.physicsBody?.velocity.dx += 10*CGFloat(acceleration.x)
            }
        }

    }
    override func update(_ currentTime: TimeInterval) {
        //nothing here
    }
}

源代码:https://github.com/maetschl/spritekitexamples/tree/master/coremotiontest

最新更新