5/10 計時器追加功能

內容程式出處:

Learning Cocos2D: A Hands-On Guide to Building iOS Games with Cocos2D, Box2D, and Chipmunk



昨天的忘了寫了,主要是製作顯示在遊戲螢幕上方的計時器,只要遊戲一啓動,就會在螢幕上方跑,這還真不簡單,本來以為NSTimer可能就是我要的東西,但這似乎是內部的計時器,搭配run loop去啓動計時器傳送訊息出去,而不單純只是顯示在螢幕上的計時器。

基本上只要是跟時間有關就需要跟CCTime有關的東西,但是你要顯示時間真的需要使用CCTime嗎?

後來我查到,如果我要尋找當前的場景他目前的時間,我只要使用一個Cocoa內建的功能,CACurrentMediaTime(),這個可以傳回你目前這個動畫的時間,或是你目前場景的時間。

然後寫一個tick:或是update:,不過以我的遊戲功能來說簡單的tick:就夠了,使用tick:只是為了讓該場景的物件隨著時間進行的去執行它而已。

在一開始的嘗試中,我曾試過使用CCLabelTTF去貼上時間,就是寫一個方法假設叫做:

-(void) displayTime:(ccTime) dt {
......
CCLabelTTF *timeLabel = [....];
....
}

然後在init方法裡面使用:

[self schedule:@selector(displayTime:)];

可是這樣會不斷貼上timeLabel完全看不到時間。

後來找到人家講的上面那個功能我才能寫出來。

簡單說,你先寫一個函數去計算你要的時間格式:

-(void) displayTime:(double) secs {
       secs = MAX ( secs, 0 ); // 確認至少是0而不是負值
       double intPart = 0;
       double fracPart = modf ( secs, &intPart );
       int isecs = (int) intPart;
       int min = isces / 60;
       int sec = isecs % 60;
       int hund = (int) ( fracPart * 100 );
       [timeLabel setString : [NSString stringWithFormat : @"%02d:%02d:%02d", min, sec, hund]];
}

當然timeLabel是我已經宣告在該類的interface的變數。

然後在init裡面儲存現在的時間和初始化timeLabel:

       startTime = CACurrentMadiaTime();
       ....
       timeLabel = [CCLabelTTF labelWithString : @"" fontName:@"Marker Felt" fontSize:64 ];

寫一個簡單的update:方法:

-(void) update : (ccTime) dt {
       double nowTime = CACurrentMediaTime() - startTime;
       [self displayTime:nowTime];
}

最後在init裡面呼叫update就好了(放最下面):

[self schedule : @selector ( update: )];

追加功能

後來我要追加比方像是能夠暫停的功能,這邊犯了個蠢,忘了在init裡面打開觸碰功能:

isTouchEnabled_ = YES;

沒這樣的話任憑你怎麼觸碰都不會有反應的喔!

後來我想增加暫停功能,可是我寫出來的方法有個問題,雖然能暫停跑動的時間,但再度起動時,時間並不是從停止的地方開始計算,而還會累計暫停時的時間,這應該跟我使用update:有關,這個東西的時間是系統的時間所以是獨立的吧?

第二次嘗試

後來我在interface宣告兩個變數,t1和t2,然後在觸控函數裡面用迴圈來將第一次觸碰的時間記錄在t1,第二次記錄在t2。

t1 = CACurrentMediaTime; //像這樣

然後在update裡面增加處理暫停時間的code:

double nowTime = CACurrentMediaTime() - startTime;
double timeInterval = t2 - t1;
[self displayTime: nowTime - timeInterval ];

可是,雖然第一次的暫停他會處理得好,但第二次暫停他又無法減去暫停時經過的時間了。

第三次嘗試

後來我想說是不是要把t1和t2都歸零,就增加了:

[self displayTime: nowTime - timeInterval ];
t1 = t2 = 0;

很顯然,現在連第一次都會計入暫停時經過的時間了,這方法不對。

第四次嘗試

再來我把原來在觸碰方法裡面的t2修改一下,發現跟第三次嘗試的結果一樣。

t2 = CACurrentMediaTime - t1;

然後修改成下面:

double nowTime = CACurrentMediaTime() - startTime;
[self displayTime: nowTime - t2];

這倒很奇怪?

留言