2014-07-10 42 views
0

在我的精靈套件遊戲中,角色通過傾斜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時,加速度計實際停止需要一些時間。事實上,直到我在多任務處理視圖中觸摸另一個窗口。所有這些數據都由加速度計保存,然後在返回時使用。所以我只需將我的通知放置在場景中,現在所有工作都正常。感謝大家的洞察力。

+0

也許只是忽略應用程序從後臺返回後獲得的第一個值,或者將獲得的第一個值作爲偏移量或類似的值? – Bastian

+0

您是否檢查過三角洲是否爲偶然性? –

+0

@TheisEgeberg,剛剛登錄。它起始於567這樣的真正高點,然後下降到1.5,然後到其餘時間的平均值約爲0.003,但這就是爲什麼我在if語句中插入希望解決這個問題,但沒有負值的原因。 – Douglas

回答

1

我認爲讓它進入背景,恢復,然後返回到遊戲中沒有插入最後一次閱讀和回來後第一次閱讀之間的內容是沒有多大意義的。在遊戲中,它基本上意味着用戶可以無限快速地「移動」設備。也就是說,用戶可以將設備向左傾斜,然後放入背景中。在背景中傾斜,然後再次打開。現在加速度計數據有了巨大的跳躍,這意味着巨大的跳躍。解決這個問題的一種方法是讓加速度計不設置移動的物理對象的速度,但有一箇中間變量影響速度隨着時間的推移。

+0

我明白你在說什麼,不管我做什麼,它仍然因爲不同而跳。但是,如果我使用加速度計移動角色,並且您的建議是沒有加速度計設置速度,那麼我將如何傾斜手機並獲得移動?我將如何去使用這個中間變量?再次感謝您的幫助。 – Douglas

+0

你有設置施加力的變量。這被設置爲零開始。如果設備傾斜,您可以像這樣更改施加的力:appliedForce + = deviceTilt * 0.5(可選衰減係數)。然後你施加的力量:appliedForce =(appliedForce> 5?5:appliedForce); appliedForce =(appliedForce <-5 -5:appliedForce?); - 然後將appliedForce應用於物理對象。它基本上是抑制和上限。 –

+0

Theis,非常感謝您的幫助。我用解決方案做了另一個編輯。但如果它不適合你,我就永遠找不到它。非常感謝您的時間和努力! – Douglas

0

感謝Theis的幫助,我終於弄清楚了。我最終記錄了來自加速度計的所有數據,發現它在馬上進入背景時並沒有停止。我通過使用通知暫停了我的遊戲。 [NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willResignActive)name:UIApplicationWillResignActiveNotification object:nil];

在willResignActive方法中暫停我的遊戲。但是,我將這些通知放置在保存我的Sprite Kit場景的視圖控制器中。所以當應用程序實際上進行Resign Active時,加速度計實際停止需要一些時間。事實上,直到我在多任務處理視圖中觸摸另一個窗口。所有這些數據都由加速度計保存,然後在返回時使用。所以我只需將我的通知放置在場景中,現在所有工作都正常。感謝大家的洞察力。

+0

在這裏你去@rickster。感謝您的建議。 – Douglas