Iphone 校准后加速度计是否更灵敏?

Iphone 校准后加速度计是否更灵敏?,iphone,objective-c,ios,uiaccelerometer,calibration,Iphone,Objective C,Ios,Uiaccelerometer,Calibration,所以我在游戏中做了一个基本的校准,如下所示: 校准代码: - (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration { [[NSUserDefaults standardUserDefaults] setFloat:acceleration.x forKey:@"X-Calibrate"]; } 在我的游戏视图中,这些是加速度计的一些定义: #d

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

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {
    [[NSUserDefaults standardUserDefaults] setFloat:acceleration.x forKey:@"X-Calibrate"];
}
在我的游戏视图中,这些是加速度计的一些定义:

#define kFilteringFactor 0.13
#define MAXXACCELERATION 24
在我的game类的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));
}
int rollingAmount = (IS_IPAD() ? 52 : 44);
CGFloat xFloat = (rollingX * rollingAmount);
pos.x += xFloat < -MAXXACCELERATION ? -MAXXACCELERATION : (xFloat > MAXXACCELERATION ? MAXXACCELERATION : xFloat);
然后我会这样做:

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));
}
int rollingAmount = (IS_IPAD() ? 52 : 44);
CGFloat xFloat = (rollingX * rollingAmount);
pos.x += xFloat < -MAXXACCELERATION ? -MAXXACCELERATION : (xFloat > MAXXACCELERATION ? MAXXACCELERATION : xFloat);
calibrationFloat设置为游戏开始前从NSUserDefaults读取的值

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

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));
}
int rollingAmount = (IS_IPAD() ? 52 : 44);
CGFloat xFloat = (rollingX * rollingAmount);
pos.x += xFloat < -MAXXACCELERATION ? -MAXXACCELERATION : (xFloat > MAXXACCELERATION ? MAXXACCELERATION : xFloat);
int rollingAmount=(IS_IPAD()?52:44);
CGFloat xFloat=(滚动X*滚动安装);
位置x+=xFloat<-最大加速度-MaxX加速度:(xFloat>MaxX加速度?MaxX加速度:xFloat);
然后我根据pos.x设置图像的位置但这就是问题所在: 校准后,我的图像移动的灵敏度非常高,使其移动非常快。在我校准之前,运动速度很快,所以校准一定出了问题

这里有什么不对劲吗,我的计算有什么问题吗


谢谢

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

因为在读取设置之前,您无法确定是否已将其写入磁盘,所以您最好立即强制应用程序写入

在apple文档中:

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

  • (BOOL)如果数据成功保存到磁盘,则同步返回值为是,否则为否
并尝试使用setDouble:而不是setFloat(UIAccelerationValue x定义为double…当然,当您稍后阅读它时,请使用doubleForKey:)


“calibrationValue设置为从NSUserDefaults读取的值”我在代码中的任何地方都看不到
calibrationValue
。我添加了它。对不起!:)好的,没问题。然而,我仍然没有看到这个变量在任何地方被使用。您是指
calibrationFloat
,还是这两个变量不同?(另外,我看到你问了一个与此相关的问题,回答说你对
rollingX
的计算不正确。你是否完全排除了这一点?)是的,我的问题使用了错误的变量,我更新了它。这个答案是针对这个问题的:然而,他没有提供一个关于如何修正rollingX计算的足够具体的答案。我也知道他说要在3D比例上校准,但在这种情况下,我只关心X轴。因此,不,我没有修复rollingX计算错误,因为我不确定错误在哪里或如何修复。您第一次在哪里初始化
rollingX
?不幸的是,这不是问题所在,值是正确的,只是我的计算似乎有误,我不确定它们应该是什么。