在我的精靈套件遊戲中,角色通過傾斜iPhone來移動。我已經使用CMMotionManager完成了這個任務。它像一個魅力。SpriteKit,使用加速度計回到前景時,精靈移動速度非常快。
- (void)processUserMotionForUpdate:(NSTimeInterval)currentTime
{
CMAccelerometerData *data = self.motionManager.accelerometerData;
//NSLog(@"data is %[email protected]", data);
if (fabs(data.acceleration.x) > 0.2)
{
[self.player.physicsBody applyForce:CGVectorMake(40 * data.acceleration.x, 0)];
}
}
謝謝Ray Wenderlich!
我用下面的代碼啓動和停止加速度計。
[self.motionManager startAccelerometerUpdates];
[self.motionManager stopAccelerometerUpdates];
這也很好。
我遇到的問題是當應用程序獲得背景,然後回到前臺。當進入背景時,我有加速度計停止,並且當它來到前景時開始備份。不過,如果我在應用程序背景時傾斜iPhone,然後再回到應用程序,我的精靈就會拍攝到所有地方。這幾乎就像加速度計一直在緩存中保存在緩存中的數據並立即全部釋放!
爲了解決這個問題,我嘗試使用accelerometerUpdateInterval。我NSLogged的價值,它成爲0.010000。所以當應用程序進入後臺時,我將其設置爲非常高的數字,希望加速度計可以記錄更多數據。
self.motionManager.accelerometerUpdateInterval = 11111;
但它沒有奏效。如果我傾斜手機,該角色在回到應用程序時仍然會發生。如果我保持穩定,這不會發生。我甚至在應用程序到達前臺時將角色的速度設置爲零,但這也不起作用。有沒有人有任何想法如何處理這個問題?提前致謝!!
編輯#1
這是我的更新方法的樣子。
-(void)update:(CFTimeInterval)currentTime
{
// Called before each frame is rendered
NSTimeInterval delta = currentTime - self.previousUpdateTime;
if (delta > 0.02)
{
delta = 0.02;
}
self.previousUpdateTime = currentTime;
[self.player update:delta];
}
其中,previousUpdateTime是NSTimeInterval。
EDIT#2
使用泰斯建議,我記錄一個數字,開始在0和各方法被調用時遞增,然後我還記錄在其中,該方法被稱爲時間,得到了下面的結果在背景應用程序,然後將其帶到前臺。
2014-07-12 10:42:34.838 ChargedUp[439:60b] number is 245.000000 at , 33078.175972
2014-07-12 10:42:34.855 ChargedUp[439:60b] number is 246.000000 at , 33078.192806
2014-07-12 10:42:34.871 ChargedUp[439:60b] number is 247.000000 at , 33078.209226
被切換到後臺,回來和我
2014-07-12 10:42:42.762 ChargedUp[439:60b] number is 248.000000 at , 33086.082453
2014-07-12 10:42:42.798 ChargedUp[439:60b] number is 249.000000 at , 33086.125970
2014-07-12 10:42:42.803 ChargedUp[439:60b] number is 250.000000 at , 33086.142641
2014-07-12 10:42:42.822 ChargedUp[439:60b] number is 251.000000 at , 33086.159510
2014-07-12 10:42:42.837 ChargedUp[439:60b] number is 252.000000 at , 33086.176046
這麼看來好像方法定期獲取調用。我還記錄了當前加速度計的值並得到了。
2014-07-12 10:50:30.367 ChargedUp[452:60b] data is x 0.288071 y -0.562469 z -0.778046 @ 33553.664755 at , 33553.704597
2014-07-12 10:50:30.382 ChargedUp[452:60b] data is x 0.286469 y -0.550476 z -0.794571 @ 33553.684229 at , 33553.721224
2014-07-12 10:50:30.399 ChargedUp[452:60b] data is x 0.292175 y -0.541321 z -0.808090 @ 33553.703698 at , 33553.737901
轉到背景並返回我得到。
2014-07-12 10:50:41.716 ChargedUp[452:60b] data is x -0.241135 y -0.416245 z -0.877899 @ 33565.009330 at , 33565.036282
2014-07-12 10:50:41.756 ChargedUp[452:60b] data is x -0.253601 y -0.390457 z -0.879852 @ 33565.067755 at , 33565.087821
2014-07-12 10:50:41.765 ChargedUp[452:60b] data is x -0.253601 y -0.390457 z -0.879852 @ 33565.067755 at , 33565.104657
2014-07-12 10:50:41.783 ChargedUp[452:60b] data is x -0.246246 y -0.403030 z -0.869965 @ 33565.087311 at , 33565.121255
2014-07-12 10:50:41.799 ChargedUp[452:60b] data is x -0.250214 y -0.405685 z [email protected] 33565.106754 at , 33565.137892
哎呀,想我並不需要額外的currentTime的閱讀!感謝你的幫助。
編輯#3 [解決方法]
由於泰斯的幫助,我能夠最終弄明白。我最終記錄了來自加速度計的所有數據,發現它在馬上進入背景時並沒有停止。我通過使用通知暫停了我的遊戲。 [NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willResignActive)name:UIApplicationWillResignActiveNotification object:nil];
在willResignActive方法中暫停我的遊戲。但是,我將這些通知放置在保存我的Sprite Kit場景的視圖控制器中。所以當應用程序實際上進行Resign Active時,加速度計實際停止需要一些時間。事實上,直到我在多任務處理視圖中觸摸另一個窗口。所有這些數據都由加速度計保存,然後在返回時使用。所以我只需將我的通知放置在場景中,現在所有工作都正常。感謝大家的洞察力。
也許只是忽略應用程序從後臺返回後獲得的第一個值,或者將獲得的第一個值作爲偏移量或類似的值? – Bastian
您是否檢查過三角洲是否爲偶然性? –
@TheisEgeberg,剛剛登錄。它起始於567這樣的真正高點,然後下降到1.5,然後到其餘時間的平均值約爲0.003,但這就是爲什麼我在if語句中插入希望解決這個問題,但沒有負值的原因。 – Douglas