2013-02-01 49 views
0

我正在製作一款遊戲並觀看風格遊戲(請記住Donkey Kong?),其中所有敵人都會按照設定的時間間隔移動。iPad:需要準確的替代NSTimer製作驢風格遊戲

例如,驢肉桶裏的桶可能每1秒精確移動一步。準確性至關重要,因爲玩家需要預測運動並計劃跳躍。

我正在使用NSTimer運行一個基本上處理所有敵人向前移動一步的功能。這很好,但我注意到現在和敵人都會暫時凍結,這會破壞遊戲。閱讀NSTimer文檔,似乎這只是與NSTimers一起工作的方式。

我試了一下:

我最初使用scheduledTimerWithTimeInterval但讀另一個線程使用timerWithTimeInterval與

[[NSRunLoop currentRunLoop] addTimer:autoMoveTimer forMode:NSRunLoopCommonModes]; 

沿着這說明,但我還是注意到了凍結。

,而不是運行計時器每一秒,我試圖使它運行得更加頻繁,然後在函數內部用

NSTimeInterval elapsedTimeInterval; 
elapsedTimeInterval = [gameTickerLastRan timeIntervalSinceNow]; 

if(elapsedTimeInterval<-gameSpeed){ 

     NSLog(@"%f since ticker last ran",elapsedTimeInterval); 

     gameTickerLastRan=[NSDate date]; 

//do stuff in function 

} 

檢查所經過的時間,但我仍然注意到了凍結,即使逝去時間是輸出對我來說似乎相當準確。

-1.006408 since ticker last ran 

-1.006985 since ticker last ran 

-1.007313 since ticker last ran 

-1.007193 since ticker last ran 

-1.006768 since ticker last ran 

-1.007468 since ticker last ran 

-1.007429 since ticker last ran 

-1.006759 since ticker last ran 

-1.007435 since ticker last ran 

在該函數結束後,所有的敵人都被移動了一步,我試圖迫使圖形與

[self performSelector:@selector(sweetNothings) withObject:nil afterDelay:0.0]; 

更新但這並沒有幫助。

我簡要地嘗試過爲計時器創建一個專用線程,但是我嘗試過的並沒有工作,而且我覺得我的深度太大了以至於沒有太多的嘗試。

故事板包含大約100個UIImageView,它們按照幀逐幀動畫布局。然後我使用它們的隱藏屬性打開和關閉這些動畫。

任何人都可以提出一個堅實的岩石方式讓我以精確的時間間隔運行此功能,並避免圖形凍結?

編輯:我試過一個CADisplayLink,但它看起來完全一樣 - 即它仍然凍結了大約每10秒一秒。這是我

displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(gameTicker:)]; 

[displayLink setFrameInterval:1]; 

[displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 

,然後在遊戲股票我有

CFTimeInterval elapsedTime = displayLink.timestamp - lastDrawTime; 
NSLog(@"elapsed %f", elapsedTime); 
if(elapsedTime>=gameSpeed){ 
//do stuff 
lastDrawTime = displayLink.timestamp; 
} 

編輯2:嗯,我不好意思地說,我才意識到,這是不落後的。我正在去除元素,同時通過向前的數組循環,這導致了延遲的錯覺。感謝您將我指向CADisplayLink - 看起來非常有用。我應該刪除我的問題嗎?

+1

爲什麼不使用cocos2d?它擁有創建此類遊戲所需的一切。 –

+0

我以前沒聽說過。我之前在Flash中製作了很多這類遊戲,並希望看看能否將我的結構轉換爲客觀的C語言。另外,如果我編寫了所有代碼,我發現更容易進行調試。這個框架看起來很有趣,所以我一定會考慮將來的項目。謝謝回覆。 –

+0

可能的重複[如何在Objective-C/iOS中創建準確的計時器事件?](http://stackoverflow.com/questions/10714092/how-do-i-create-an-accurate-timer-event- in-objective-c-ios) –

回答

2

看看CADisplayLink(這是Cocos2d和其他遊戲框架使用的)。

+0

看起來很有趣。明天我會試一試。謝謝! –

+0

看看這個答案快速設置! [http://stackoverflow.com/questions/10714092/how-do-i-create-an-accurate-timer-event-in-objective-c-ios](http://stackoverflow.com/questions/10714092/我怎麼做 - 準確計時器 - 事件 - 目標-c-ios) – BooRanger

+0

我正在用CADiplayLink凍結。我編輯了原文。謝謝 –