SpriteKit Accelerometer问题

时间:2017-04-21 23:59:33

标签: ios swift3 sprite-kit cmmotionmanager

我正在使用精灵套件制作游戏。在我的游戏中,我使用加速度计通过倾斜设备将节点左右移动。以下代码可以顺利运行,但是在8-10次游戏重启后,它有点滞后以响应倾斜。然后我关闭了应用程序,问题重复了。

我在motionManger.startAccelerometerUpdates()中有didMove(to view: SKView)并且有一个看起来像这样的函数

    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)
 }

当设备向左和向右倾斜时,知道为什么会发生这种情况或者让节点做出响应的更好方法吗?谢谢!

更新:

我终于弄明白为什么accelorometer是滞后的。我所要做的只是将motionManger.stopAccelerometerUpdates()添加到我的GameOver场景中。在这样做之后,我会转换回GameScene 30次以上并且响应很好!希望这个小错误可以帮助将来的某个人!

1 个答案:

答案 0 :(得分:0)

CMMotionManager.startAccelerometerUpdates必须用作对其中一个变量的引用,每次生成移动时都不必运行它。

例如在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