2

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

- (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 设置图像的位置。然而,这就是问题所在: 在我校准之后,我的图像运动的灵敏度非常高,因此它的运动速度非常快。在我校准之前,运动速度很好,所以校准一定是出了问题。

这里有什么不正确的地方吗,我的计算有问题吗?

谢谢!

4

1 回答 1

1

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

'因为您无法确定您的设置在读取之前已写入磁盘,因此您最好立即强制您的应用程序写入它

在苹果文档中:

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

  • (BOOL)synchronize 返回值 如果数据成功保存到磁盘,则为 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!!!");
    }

}
于 2012-12-05T16:25:25.653 回答