2015-07-05 3 views
0

Я делаю игру с кликером, и мне нужно, чтобы мои NSTimers продолжали работу после закрытия приложения. Сначала я посмотрел, но я не нашел подходящего ответа для Свифта. Я думаю, что могу использовать UserDefaults, но я не уверен, как его применять. Извините, если это дублированный вопрос, я знаю, что есть много информации об этом.Сделайте NSTimer продолжением после закрытия и открытия игры

var timerVar = NSTimer.scheduledTimerWithTimeInterval(4, target: self,  
selector: Selector("selectorName"), userInfo: nil, repeats: true) 

func selectorName(){ 
    var ScoreDefault = NSUserDefaults.standardUserDefaults() 
    ScoreDefault.setValue(Score, forKey: "Score") 
    ScoreDefault.synchronize() 
    Score+=1 
    scoreLbl.text = "\(Score)" 
} 
+0

Необходимо указать, для какой платформы предназначена ваша заявка. Вероятно, это iOS, но вы не сказали нам! –

+0

Кроме того, было бы полезно, если бы вы описали то, что вы пытаетесь достичь с точки зрения игрового процесса, а не кода. Когда и почему оценка меняется? –

+0

NSTimer работает отлично, и счет увеличивается со временем.Эта проблема заключается в том, что таймер останавливается, когда игра закрывается. Мне нужно, чтобы он продолжался, когда я открываю приложение и помню, сколько раз NSTimer был активирован. –

ответ

0

Хорошо, я понял. Однако это не очень эффективно, но я могу опубликовать код, возможно, кто-то может его очистить или использовать другой метод. Я закончил создание другой переменной под названием scoreIncrementor, а затем сделал NSTimer в файле didMoveToView, который выполнял каждую секунду, выполняя простое равенство score = score + scoreincrementor. Вот код, который должен кому-то понадобиться, не стесняйтесь редактировать свои сердца. Для этого я также сделал еще один ярлык, чтобы увидеть, что добавляется «tempScoreLbl».

var ScoreIncrementor = Double() 
var Score = Double() 
var scoreLbl: UILabel! 
var tempscoreLbl: UILabel! 

override func didMoveToView(view: SKView) { 

var ScoreDefault = NSUserDefaults.standardUserDefaults() 

    if (ScoreDefault.valueForKey("Score") != nil){ 
     Score = ScoreDefault.valueForKey("Score") as! Double 
    } 
    ScoreDefault.setValue(Score, forKey: "Score") 
    ScoreDefault.synchronize() 

var ScoreIncrementorDefault = NSUserDefaults.standardUserDefaults() 

    if (ScoreIncrementorDefault.valueForKey("ScoreIncrementor") != nil){ 
     ScoreIncrementor = ScoreIncrementorDefault.valueForKey("ScoreIncrementor") as! Double 
    } 

    ScoreIncrementorDefault.setValue(ScoreIncrementor, forKey: "ScoreIncrementor") 
    ScoreIncrementorDefault.synchronize() 

    let scorePerSecond = NSTimer.scheduledTimerWithTimeInterval(1 , target: self, selector: Selector("permanentIncrementor"),userInfo: nil, repeats: true) 

self.view?.addSubview(scoreLbl) 
self.view?.addSubview(tempscoreLbl) 
} 


func permanentIncrementor(){ 
    Score = Score + ScoreIncrementor 
    var ScoreDefault = NSUserDefaults.standardUserDefaults() 
    ScoreDefault.setValue(Score, forKey: "Score") 
    ScoreDefault.synchronize() 
    scoreLbl.text = "\(Score)" 

} 

func gloveUpgrade(){ 
    if Score >= 50{ 

     let scorePerSecond = NSTimer.scheduledTimerWithTimeInterval(0 , target: self, selector: Selector("gloveUpgradeTimer"),userInfo: nil, repeats: false) 
     var ScoreIncrementorDefault = NSUserDefaults.standardUserDefaults() 
     ScoreIncrementorDefault.setValue(ScoreIncrementor, forKey: "ScoreIncrementor") 
     ScoreIncrementorDefault.synchronize() 
     Score-=50 

     tempscoreLbl.text = "\(ScoreIncrementor)" 

    } 
} 
func gloveUpgradeTimer(){ 
    //increase score per minute by .25 
    var ScoreIncrementorDefault = NSUserDefaults.standardUserDefaults() 
    ScoreIncrementorDefault.setValue(ScoreIncrementor, forKey: "ScoreIncrementor") 
    ScoreIncrementorDefault.synchronize() 

    ScoreIncrementor+=0.25 
    tempscoreLbl.text = "\(ScoreIncrementor)" 
} 
0

Вы не можете приостановить и продолжить таймер. Вы должны аннулировать его, а затем создать новый. Запишите время в момент запуска таймера, а затем, когда вы его приостановите, выясните количество прошедшего времени и используйте это, чтобы выяснить, сколько времени осталось. Создайте новый таймер с количеством оставшегося времени, которое вы рассчитали.

+0

Могу ли я получить пример, я до сих пор довольно новичок в быстром. –

+0

Попробуйте написать это самостоятельно. Если у вас возникли проблемы, отправьте код, который вы пробовали, и информацию о том, какие проблемы у вас есть, и я или кто-то другой вам поможет. Вы узнаете намного больше, самостоятельно отредактировав это. –

+0

Я могу это сделать, но позвольте мне попытаться понять, что вы говорите. Вы хотите, чтобы я сделал еще один NSTimer, который вычисляет время, пока приложение неактивно. Но я не хочу, чтобы таймер продолжался, пока приложение не работает. Просто чтобы начать, когда сцена загружена снова. И чтобы количество раз я нажал кнопку таймера, чтобы быть там. т.е.: 4 клика = 1 балл в секунду. –

0

Это не касается желаемого запроса, но, возможно, это будет полезно для кого-то другого.

Приложения iOS не могут работать произвольно в фоновом режиме, как описано в Background Execution in Apple’s App Programming Guide for iOS. Было бы очень неэффективно использовать батарею, чтобы разбудить ваше приложение каждые 4 секунды, чтобы увеличить счетчик; представьте, что каждое приложение выполнило это, и были установлены сотни. См. Minimize Timer Use in Apple’s Energy Efficiency Guide for iOS Apps.

Вместо этого сохраните предыдущее время, когда вы обновили счет, а затем, когда ваше приложение снова запущено, оно может рассчитать разницу с этого момента и обновить счет соответствующим образом. Я бы сказал, что вычисление оценки - лучший дизайн, даже если приложение находится на переднем плане.

Вы можете получить текущее время с помощью функции CFAbsoluteTimeGetCurrent или с помощью NSDate().


стиль

Кода: Это не имеет отношения к этой проблеме, но есть несколько вещей, которые я бы сделал по-другому, если бы я решил написать этот метод:

func incrementScore() { 
    score += 1 
    let defaults = NSUserDefaults.standardUserDefaults() 
    defaults.setValue(score, forKey: "Score") 
    scoreLabel.text = "\(score)" 
} 
  • Имени метода что-то значимое.
  • Используйте let вместо var для стандартной ссылки по умолчанию для пользователей, так как она не изменяется.
  • Это не ScoreDefaults. Это общий стандартный пользовательский объект по умолчанию, не определенный для оценки.
  • Для переменных и имен свойств чаще всего используется строчная буква.
  • Синхронизация значений по умолчанию пользователя обычно не требуется.
+0

Хорошо, так что решает проблему, которой у меня нет. Я не пытаюсь подсчитать счет за время закрытия приложения. Когда я активирую NSTimer, скажите 4 раза. Это дает мне 1 + выигрыш в секунду. Когда я закрываю APP и открываю его. NSTimer больше не активен. Мне нужно, чтобы NSTimers или эквивалентная инкремента оценка были активны при запуске, равном количеству баллов ++, которое было дано NSTimer. –

+0

В основном, чтобы прирост был постоянным. За исключением случаев, когда приложение находится в фоновом режиме. –

+0

Вы должны поместить эту информацию в свой вопрос. Вероятно, вы хотите прослушать 'UIApplicationWillResignActiveNotification' и сделать недействительным свой таймер и прослушать ' UIApplicationDidEnterBackgroundNotification' и настроить новый таймер. –

Смежные вопросы