首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SpriteKit加速度计问题

SpriteKit加速度计问题
EN

Stack Overflow用户
提问于 2017-04-22 07:59:33
回答 1查看 218关注 0票数 0

我正在用雪碧包做一个游戏。在我的游戏中,我使用加速度计通过倾斜设备来移动节点。下面的代码运行得很流畅,但是在8-10个游戏重启后,它对倾斜的响应有点滞后。然后我关闭应用程序,这个问题又重复出现了。

我在didMove(to view: SKView)中有一个motionManger.startAccelerometerUpdates(),并且有一个如下所示的函数

代码语言:javascript
复制
    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多次,它的响应很好!希望这个小错误能在将来对别人有所帮助!

EN

回答 1

Stack Overflow用户

发布于 2017-04-22 08:39:55

CMMotionManager.startAccelerometerUpdates必须用作对某个变量的引用,没有必要在每次生成移动时都运行它。

例如在Swift 3中

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43553701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档