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 和 UIScrollView