2012-11-05 51 views
2

在我的应用程序中,我使用加速计来控制游戏中的角色。现在我只允许纵向定位,因此用户必须将设备向右或向左倾斜才能移动角色。到目前为止,这工作得很好。我现在想要完成的是“校准”加速度计,以考虑用户正在玩的当前倾斜。让我们说用户在他们身边,价值将会倾斜,因为它没有考虑到这个起点,所以他们将无法控制角色。所以我试图说明这个初始倾斜量,然后在游戏过程中考虑它,但是它不起作用。校准UIA加速度计?

所以我在我的非游戏以“校准”加速度计一个按钮,这是它执行的代码:

这是IBAction为

[[UIAccelerometer sharedAccelerometer] setUpdateInterval:1.0f/30.0f]; 
[[UIAccelerometer sharedAccelerometer] setDelegate:self]; 

这是加速度计委托调用

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration { 
    [[NSUserDefaults standardUserDefaults] setFloat:acceleration.x forKey:@"X-Calibrate"]; 
    [[UIAccelerometer sharedAccelerometer] setDelegate:nil]; 
} 

然后在我的游戏显示在init我将iVar calibrationFloat设置为我在NSUserDefaults中设置的值。然后我还有一个kFilteringFactor来摆脱小小的不安。因此,这是这台rollingX等于一切游戏加速计委托方法,然后我谨基于rollingX字符:

- (void) accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration { 
    rollingX = ((acceleration.x - calibrationFloat) * kFilteringFactor) + (rollingX * (1.0 - kFilteringFactor)); 
} 

但是这是行不通的,校准似乎并没有做任何事情,我不确定为什么。有没有人设置为什么这不会工作?

回答

2

我可以给你一些指示。 rollingX的计算是不正确的,它会给出超出范围-1 - +1的值,您需要一种方法来检测它达到极限并适当调整。也简单地偏移一个轴将不起作用。加速度计在3D空间中工作。为了让您的计算正常工作,手机在z平面上始终必须为0。用户旋转手机的z平面越远,设备将在x平面上输出的读数越小。加速度计感受到重力,所以飞机相对于此是固定的。

为了执行有效的校准,您需要对所有3轴应用连续矩阵变换,因为您需要加权偏移量(例如,当z增加时,更注意y而不是x等)。

+0

会有什么办法可以提供代码示例吗?我自己并不太熟悉加速度计和矩阵,所以我发布了代码示例的赏金。非常感谢! –

+0

我之前做过类似的事情,但我无法告诉你我头顶的恐惧。看看这个博客文章,但希望这应该有所帮助! http://www.paradeofrain.com/2010/07/lessons-learned-in-tilt-controls/ –

+0

任何运气与该博客文章?还有什么问题请告诉我! –