加速度计数据不正确,延迟几秒钟

时间:2015-02-17 17:54:38

标签: ios swift sprite-kit game-physics

我正在使用Swift和SpriteKit创建一个非常简单的游戏,我正在使用加速计数据(加速度x,y)在屏幕上移动球。

我会说代码工作正常,但我注意到有时候(通常是在我打开应用程序时)加速计数据不正确并延迟了几秒钟。

为什么会这样?

我使用以下代码读取加速度计数据:

if motionManager.accelerometerAvailable == true {
        motionManager.startAccelerometerUpdatesToQueue(NSOperationQueue.currentQueue(), withHandler:{
            data, error in
            self.accX = CGFloat(data.acceleration.x)
            self.accY = CGFloat(data.acceleration.y)
        })
}

并且功能更新以对球施加一些冲动:

override func update(currentTime: CFTimeInterval) {
    var impulse = CGVectorMake(accX, accY)
    var obj = childNodeWithName("ball") as SKSpriteNode
    obj.physicsBody?.applyImpulse(impulse)
}

我错过了什么吗?

谢谢

2 个答案:

答案 0 :(得分:1)

对于任何加速度计数据,最好通过过滤器运行它以消除任何不规则的尖峰。这是我的最爱:

double filteredAcceleration[3];
memset(filteredAcceleration, 0, sizeof(filteredAcceleration));
CMAccelerometerData *newestAccel = motionManager.accelerometerData;
filteredAcceleration[0] = (filteredAcceleration[0]*(1.0-alpha)) + (newestAccel.acceleration.x*alpha);
filteredAcceleration[1] = (filteredAcceleration[1]*(1.0-alpha)) + (newestAccel.acceleration.y*alpha);
filteredAcceleration[2] = (filteredAcceleration[2]*(1.0-alpha)) + (newestAccel.acceleration.z*alpha);

alpha可以是0到1之间的任何值。越接近1,响应越快,越接近零,它就越平滑。 iPhone上我最喜欢的价值是0.2这是一个很好的折衷方案,可以平滑地响应像涂鸦跳跃这样的游戏,或者可能会移动一个球。

我不知道为什么加速度计数据在启动时不正确/延迟,我的猜测是硬件必须唤醒并自行校准,但不管原因如何,如果你实施过滤器,它将会消除这些不规则性,他们几乎不会引人注意。

答案 1 :(得分:0)

我优先考虑这两个功能,问题似乎已经解决。

let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT
dispatch_async(dispatch_get_global_queue(priority, 0)) {
    // do some task
    dispatch_async(dispatch_get_main_queue()) {
        // code with priority
    }
}