2012-11-05 69 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

任何運氣與該博客文章?還有什麼問題請告訴我! –