校准后UIAccelerometer更灵敏?

时间:2012-11-28 03:52:16

标签: iphone objective-c ios uiaccelerometer calibration

所以我在游戏中做了基本校准,如下所示: 校准代码:

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {
    [[NSUserDefaults standardUserDefaults] setFloat:acceleration.x forKey:@"X-Calibrate"];
}

然后在我的游戏视图中,这些是加速度计的一些定义:

#define kFilteringFactor 0.13
#define MAXXACCELERATION 24

在我的游戏类的init方法中,我这样做:

calibrationFloat = [[NSUserDefaults standardUserDefaults] floatForKey:@"X-Calibrate"];

然后我这样做:

- (void) accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {
    //Low Pass Filter (gets rid of little jitters) + Calibration value combined
    rollingX = ((acceleration.x - calibrationFloat) * kFilteringFactor) + (rollingX * (1.0 - kFilteringFactor));
}

calibrationFloat设置为游戏开始前从NSUserDefaults读取的值。

然后在游戏循环中我这样做:

int rollingAmount = (IS_IPAD() ? 52 : 44);
CGFloat xFloat = (rollingX * rollingAmount);
pos.x += xFloat < -MAXXACCELERATION ? -MAXXACCELERATION : (xFloat > MAXXACCELERATION ? MAXXACCELERATION : xFloat);

然后我根据pos.x设置我的图像的位置。 但问题是: 在我校准之后,我的图像运动的灵敏度因为非常高而使其运动非常快。在我校准之前,运动的速度很快,因此校准时必须出错。

这里有什么不合适的,我在计算上做错了吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

尝试添加同步,以确保您在NSUserDefaults中写入了正确的值:

'如果您在阅读之前无法确定您的设置已写入磁盘,那么您最好强制您的应用立即编写

在apple doc中:

  

synchronize将对持久域的任何修改写入磁盘   并将所有未修改的持久域更新为磁盘上的内容。

     
      
  • (BOOL)同步返回值如果数据已成功保存到磁盘,则为YES,否则为NO。
  •   

并尝试使用setDouble:而不是setFloat(UIAccelerationValue x被定义为double ...当然使用doubleForKey:当你稍后阅读时)

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {
    [[NSUserDefaults standardUserDefaults] setDouble:acceleration.x forKey:@"X-Calibrate"];
    if ([[NSUserDefaults standardUserDefaults] synchronize]) {
        NSLog(@"OK: well written!!!");
    }else {
        NSLog(@"NO! Error!!!");
    }

}