我在Spritekit中創建了一款遊戲,並且我嘗試設置我的遊戲的方式是,當玩家失去他們所有的生命時,他們必須等待30分鐘才能獲得他們的一生恢復,以便他們可以再次玩。我嘗試使用NSTimer來做到這一點,但我認爲UINotification將會更有效,因爲我希望這個計時器能夠運行,不管應用程序是否被終止,在後臺使用或不被使用。儘管如此,我仍然遇到了問題。使用UILocalNotification恢復遊戲生命
我有下面的代碼編寫迄今爲止,當用戶到達GameOverScene
-(instancetype)initWithSize:(CGSize)size {
if (GameLives < 5) {
alarm = [[UILocalNotification alloc] init];
alarm.fireDate = [NSDate dateWithTimeIntervalSinceNow:thirtyNewMinutes];
alarm.timeZone = [NSTimeZone localTimeZone];
[[UIApplication sharedApplication] scheduleLocalNotification:alarm];
alarm.repeatInterval = NSCalendarUnitHour;
NSLog(@"AlarmFireDate = %@", alarm.fireDate);
}
}
的alarm.firedate顯示正確的NSLog的,當我到達GameOverScene但是當我關閉我的應用程序並重新啓動它,它在我的視圖控制器中顯示爲空,並且從不觸發。如何讓我的應用程序在通知安排後自動更新用戶的後臺,而不管用戶是否使用該應用程序?它應該在我的應用程序委託中運行嗎?
應該像下面的某種類型的NSDate比較運行的地方?
if ([[NSDate date] compare:allarm.fireDate] == NSOrderedDescending) {
GameLives = GameLives + 1;
NSLog(@"SUCCESS");
NSLog(@"COUNT = %lu", (long)GameLives);
}
else if ([[NSDate date] compare:allarm.fireDate] == NSOrderedAscending){
GameLives = GameLives + 1;
NSLog(@"FAILURE");
NSLog(@"COUNT = %lu", (long)GameLives);
}
else if ([[NSDate date] compare:allarm.fireDate] == NSOrderedSame){
NSLog(@"SAME");
NSLog(@"COUNT = %lu", (long)GameLives);
}
我非常感謝任何能提供幫助的人。
編輯:響應對Answers低於
我寫的的NSTimer和當遊戲達到GAMEOVER現場的計時器開始下面的代碼。
-(void)restoreLives{
thirtyNewMinutes = 60 * 30;
update = [NSDate dateWithTimeIntervalSinceNow:thirtyNewMinutes];
if ([[NSDate date] compare:update] == NSOrderedDescending) {
NSLog(@"date1 is later than date2");
NSLog(@"SUCCESS");
NSLog(@"CurrentDate: %@", [NSDate date]);
// LifeText = @"Restored";
GameLives = GameLives + 1;
NSLog(@"LIVES = %ld", (long)GameLives);
// NSLog(@"Level 2 HighScore, %d", _Level1HighScoreNumber);
} else if ([[NSDate date] compare:update] == NSOrderedAscending) {
NSLog(@"date1 is earlier than date2");
NSLog(@"FAILURE");
NSLog(@"CurrentDate: %@", [NSDate date]);
NSLog(@"LIVES = %ld", (long)GameLives);
// Lives = 5;
// NSLog(@"dates are the same");
}
if (GameLives < 4){
[LifeTimer invalidate];
}
然後我創建了一個NSTimer來運行該方法。
-(void)CheckTime{
LifeTimer = [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(restoreLives) userInfo:nil repeats:YES];
}
我將如何得到它來保存你說的目標時間?
而且,希望我不會過度這個想法,但從另一個角度來看,如果我想比較當前的NSDate和[NSDate dateWithTimeIntervalSinceNow:thirtyNewMinutes];我不需要保存[NSDate dateWithTimeIntervalSinceNow:thirtyNewMinutes]的原始日期;當它最初被調用時,如果應用程序終止並且計時器再次運行代碼,它會將其與原始代碼的調用時間進行比較,並且不會重置NSDate,並將其與用戶重新啓動應用程序時的30分鐘進行比較並且定時器再次開始。
即7:15
NSDate comparison to update = [NSDate dateWithTimeIntervalSinceNow:thirtyMinutes];
被調用。定時器設置爲在7點45分更新生命。
7:30用戶終止他們的應用程序並重新啓動它在7:35
當的NSTimer再次運行不會重置爲從7:35,因爲它得有30分鐘,現在30分鐘的時間?如果是這種情況,我會如何去保存原始日期?請讓我知道,請記住我仍然是初學者Objective C
爲什麼要使用通知?只需跟蹤應該添加生活的時間。使用NSTimer在那個時候關閉。如果用戶關閉了應用程序並稍後重新啓動,則您可以查看保存的關閉時間,並在有剩餘時間的情況下重新設置計時器,否則您會授予新的生命。 – rmaddy
感謝您的回覆,但是如何在應用終止時保存原始NSDate或目標時間?你介意提供一些示例代碼嗎? – John
將它存儲在'NSUserDefaults'中。 – rmaddy