所以我在游戏中做了基本校准,如下所示: 校准代码:
- (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设置我的图像的位置。 但问题是: 在我校准之后,我的图像运动的灵敏度因为非常高而使其运动非常快。在我校准之前,运动的速度很快,因此校准时必须出错。
这里有什么不合适的,我在计算上做错了吗?
谢谢!
答案 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!!!");
}
}