Я создаю игру в 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, но когда я закрыть мое приложение и перезапустить он отображается как null в моих контроллерах и никогда не срабатывает. Как получить мое приложение для автоматического обновления жизней пользователя в фоновом режиме после того, как уведомление запланировано независимо от того, использует ли пользователь приложение или нет? Должен ли он выполняться в моем делегате приложения?
Должно ли какое-либо сравнение 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);
}
Я был бы очень признателен всем, кто может оказать помощь.
EDIT: ОТВЕТ НА ОТВЕТЫ НИЖЕ
Я написал следующий код для 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: тридцать новых пользователей]; мне не нужно сохранять исходную дату [NSDate dateWithTimeIntervalSinceNow: тридцать новых пользователей]; когда это изначально было вызвано так, что если приложение завершается, и таймер запускает код снова, он сравнивает его с исходным временем, когда код вызывался, и не сбрасывает NSDate и сравнивает его с 30 минутами с момента перезапуска приложения и таймер начнется снова.
т.е. 7:15
NSDate comparison to update = [NSDate dateWithTimeIntervalSinceNow:thirtyMinutes];
называется. И таймер установлен для обновления жизни в 7:45.
7:30 Пользователь завершает свое приложение и перезапускает его в 7:35
Когда NSTimer запускается снова не будет его сбросить время, чтобы быть в 30 минутах от 7:35, так как это 30 минут с этого момента? Если это так, как я могу сохранить первоначальную дату? Пожалуйста, дайте мне знать, имейте в виду, что я все еще новичок в Objective C
Зачем использовать уведомление? Просто отслеживайте, когда нужно добавить жизнь. Используйте NSTimer, чтобы уйти в это время. Если пользователь закрывает приложение и позже перезагружается, вы смотрите на то, что сэкономленное время выключения, и снова настройте таймер, если осталось время, иначе вы даете новую жизнь. – rmaddy
Спасибо за ваш ответ, но как вы собираетесь сохранить исходное NSDate или целевое время, когда приложение будет прекращено? Не могли бы вы предложить примерный код? – John
Сохраните его в 'NSUserDefaults'. – rmaddy