2010-03-28 24 views
0
- (void) applicationDidFinishLaunching:(UIApplication *)application 
    { 
    //set up main loop 
    [NSTimer scheduledTimerWithTimeInterval:0.033 
    target:self selector:@selector(gameLoop:) userInfo:nil repeats:NO]; 
    //create instance of the first GameState 
    [self doStateChange:[gsMain class]]; 
    } 
- (void) gameLoop: (id) sender 
    { 
    [((GameState*)viewController.view) Update]; 
    [((GameState*)viewController.view) Render]; 
    [NSTimer scheduledTimerWithTimeInterval:0.033 target:self 
    selector:@selector(gameLoop:) userInfo:nil repeats:NO]; 
    } 

此代碼來自iPhone遊戲開發書。我不知道爲什麼gameLoop方法需要再次調用NSTimer?在applicationDidFinishLaunching中,它設置NSTimer來做,爲什麼不讓它每0.033s做一次,爲什麼要在gameLoop方法中添加相同的NSTimer代碼?太赫茲。爲什麼需要在此代碼中再次調用NSTimer,而不是重複:YES?

更新:對不起,我的問題應該澄清......爲什麼代碼不只是簡單地調用重複:YES?

+0

可能是因爲它的代碼錯誤。在這種情況下,保持對計時器的引用並在你不希望它再次觸發時使其自動失效更有意義。 – 2010-03-28 16:13:09

回答

0

你當然可以通過打開重複逃脫:YES上:

//set up main loop 
[NSTimer scheduledTimerWithTimeInterval:0.033 
target:self selector:@selector(gameLoop:) userInfo:nil repeats:YES]; 

其實,你會離開這種方式比較好,因爲時間會比較一致的 - 你已經在這裏列出的代碼只是開始計算出幀後的新計時器,如果這些呼叫需要不同的時間,這會給你不規則的幀。

+0

或者,也許目的是讓延遲計算從視圖完成渲染的時候開始?如果是這樣,原作者肯定應該注意到這是一個評論,因爲它非常令人困惑,否則爲什麼他不只是使用重複:YES – 2010-03-28 16:06:55

0

由於NSTimer是用「重複:否」創建的,它會觸發一次,然後自動失效,從而防止計時器再次觸發。

因此,每次使用「重複:否」時都需要新的計時器。

0

這是個玩笑嗎?設置repeats:YES。你特意告訴它不要繼續射擊。所以:

- (void) applicationDidFinishLaunching:(UIApplication *)application 
    { 
    //set up main loop 
    [NSTimer scheduledTimerWithTimeInterval:0.033 
    target:self selector:@selector(gameLoop:) userInfo:nil repeats:YES]; 
    //create instance of the first GameState 
    [self doStateChange:[gsMain class]]; 
    } 

這甚至自我記錄!

+0

爲什麼不把它改爲YES? – Tattat 2010-03-28 16:10:26

+0

大衛格爾哈爾爲什麼說得好,但你的問題在編輯之前還不清楚(這是我回答的時候)。 – 2010-03-28 16:29:06

+0

我只是遇到他的評論,任何方式。 – Tattat 2010-03-28 16:36:16

相關問題