我正在使用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)
}
我错过了什么吗?
谢谢
答案 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
}
}