【问题标题】:SpriteKit Accelerometer issuesSpriteKit 加速度计问题
【发布时间】:2017-09-19 02:31:23
【问题描述】:

我正在使用 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() 添加到我的GameOver 场景中。这样做之后,我会转换回 GameScene 30 多次,它的反应很好!希望这个小错误对以后的人有所帮助!

【问题讨论】:

  • 您是否检查了场景是否正在被释放?如果没有,请将deinit{print"deinit"} 添加到您的场景类并转换到新场景。
  • 是的,我检查过了,它正在被释放。我找到了我的解决方案。菜鸟失误!在我的游戏结束函数中,我忘记添加 motionManger.stopAccelerometerUpdates()。

标签: ios swift3 sprite-kit cmmotionmanager


【解决方案1】:

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

【讨论】:

  • 那么您的代码中可能还有另一个问题。 =(
  • 这可能是原因......嘿,但还是谢谢!我会去回溯我的步骤,看看是什么原因造成的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多