UIAccelerometer 校准后更灵敏?

Posted

技术标签:

【中文标题】UIAccelerometer 校准后更灵敏?【英文标题】:UIAccelerometer more sensitive after calibration? 【发布时间】:2012-11-28 03:52:15 【问题描述】:

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

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

这里似乎有什么不对的地方,我的计算有问题吗?

谢谢!

【问题讨论】:

"calibrationValue 设置为从 NSUserDefaults 读取的值" 我在代码中的任何地方都看不到 calibrationValue 我添加了它。对于那个很抱歉! :) 好的,没问题。但是,我仍然没有看到该变量在任何地方使用。你的意思是calibrationFloat 还是这两个不同的变量? (另外,我看到你问了一个相关的问题,答案说你对rollingX 的计算不正确。你完全排除了吗?) 是的,我的问题使用了错误的变量,我更新了它。那个回答者是针对这个问题的:***.com/questions/13225713/calibrate-uiaccelerometer 但是,他没有就如何修复 rollingX 计算提供足够具体的答案。我也知道他说要校准 3D 比例,但在这种情况下,我只关心 X 轴。所以不,我没有修复 rollingX 计算错误,因为我不确定错误在哪里或如何解决。 第一次在哪里初始化rollingX 【参考方案1】:

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

'因为你不能确定你的设置在你读取它之前已经写入磁盘,所以你最好强制你的应用程序立即写入它

在苹果文档中:

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

(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!!!");
    


【讨论】:

不幸的是,这不是问题,值是正确的,只是我的计算似乎是错误的,我不确定它们应该是什么。

以上是关于UIAccelerometer 校准后更灵敏?的主要内容,如果未能解决你的问题,请参考以下文章

(九十二)加速计的使用方法(过期方法+新方法)

UIAccelerometer距离计算

UIAccelerometer 和 UIScrollView

UIAccelerometer 已弃用 ios7

UIAccelerometer 和 UIScrollView

iPhone中的UIAccelerometer