內容程式出處:
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];
這倒很奇怪?
留言
張貼留言