Ios Swift:NSTimer替代方案

Ios Swift:NSTimer替代方案,ios,xcode,swift,nstimer,Ios,Xcode,Swift,Nstimer,我制作了一个flappy bird克隆,但在尝试实现暂停功能时,我遇到了NSTimer的问题,它正在生成管道 var timer = NSTimer.scheduledTimerWithTimeInterval(moveSpeed, target: self, selector: Selector("makePipes"), userInfo: nil, repeats: true) 由于NSTimer不能暂停,我在makePipes()函数中实现了一个简单的if语句,检查游戏是否暂停,如果暂

我制作了一个flappy bird克隆,但在尝试实现暂停功能时,我遇到了NSTimer的问题,它正在生成管道

var timer = NSTimer.scheduledTimerWithTimeInterval(moveSpeed, target: self, selector: Selector("makePipes"), userInfo: nil, repeats: true)
由于NSTimer不能暂停,我在makePipes()函数中实现了一个简单的if语句,检查游戏是否暂停,如果暂停,则不生成新的管道。但是,由于计时器在暂停状态期间仍在启动,因此每个管道系列之间的间隙不一致

此外,当从菜单转换到游戏状态时,计时器会触发时间,快速连续地创建前两个管道


是否有替代NSTimer的方法来处理此功能?

您可以在游戏暂停时停止调用
func invalidate()
的计时器,然后在游戏取消暂停时重新启动它

更新:

您可以添加第二个计时器,该计时器在与下一次点火和暂停时间不同时触发,第二个计时器应触发第一个计时器,然后将第一个计时器重置为初始时间

步骤:

  • 添加一个每2秒触发一次的计时器

  • 当游戏暂停时,从
    定时器.fireDate
    timeofpuse
    计算时间间隔,应该是
    intervalTillNextTrigger

  • 添加第二个
    afterPauseTimer
    ,它在
    intervallTillNextTrigger
    触发,不应重复

  • 调用
    afterPauseTimer
    时,使用
    timer.fire()
    触发第一个计时器,使
    timer
    无效,因为
    timer.fire()
    不会中断它的常规触发计划,请以2秒的触发间隔再次添加
    timer
    并使
    afterPauseTimer
    无效

  • 见下面的代码:

    //
    //  ViewController.swift
    //  swft ios
    //
    //  Created by Marius Fanu on 30/12/14.
    //  Copyright (c) 2014 Marius Fanu. All rights reserved.
    //
    
    import UIKit
    
    class ViewController: UIViewController {
    
        var timer: NSTimer!
    
        var isPaused = false
        var isAfterPause = false
        var intervalTillNextTrigger: NSTimeInterval = 0
        var afterPauseTimer: NSTimer!
    
        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view, typically from a nib.
    
            timer = NSTimer(timeInterval: 2, target: self, selector: Selector("timerTriggerd"), userInfo: nil, repeats: true)
            NSRunLoop.mainRunLoop().addTimer(timer, forMode: NSDefaultRunLoopMode)
            timer.fire()
        }
    
        @IBAction func pauseButtonPressed(sender: UIButton) {
            var now = NSDate()
            println("now = \(now)")
    
            if isPaused == true {
                if isAfterPause {
                    isAfterPause = false
                    afterPauseTimer = NSTimer(timeInterval: intervalTillNextTrigger, target: self, selector: Selector("timerAfterIntervalTrigger"), userInfo: nil, repeats: false)
                    NSRunLoop.mainRunLoop().addTimer(afterPauseTimer, forMode: NSDefaultRunLoopMode)
                }
    
                timer = NSTimer(timeInterval: 2, target: self, selector: Selector("timerTriggerd"), userInfo: nil, repeats: true)
                NSRunLoop.mainRunLoop().addTimer(timer, forMode: NSDefaultRunLoopMode)
            }
            else {
                isAfterPause = true
                intervalTillNextTrigger = timer.fireDate.timeIntervalSinceDate(now)
                println("till next trigger \(intervalTillNextTrigger)")
                timer.invalidate()
                timer = nil
            }
    
            isPaused = !isPaused
        }
    
        func timerTriggerd() {
            NSLog("Triggerd!")
        }
    
        func timerAfterIntervalTrigger() {
            println("reset timer")
            timer.fire()
            timer.invalidate()
            timer = nil
    
            timer = NSTimer(timeInterval: 2, target: self, selector: Selector("timerTriggerd"), userInfo: nil, repeats: true)
            NSRunLoop.mainRunLoop().addTimer(timer, forMode: NSDefaultRunLoopMode)
    
            afterPauseTimer.invalidate()
            afterPauseTimer = nil
        }
    
    }
    

    哦,好家伙,世界需要更多的“飞禽”克隆,我们必须赶上“2048”克隆的数量。抱歉,无法抗拒:-)为什么不能停止计时器,在播放恢复时再次启动它?是的,正如@MidhunMP所说,暂停时停止计时器,并在播放恢复时安排新的计时器。同样的问题也会出现。例如:每2秒它就会触发一次。它就要开火了,比方说离开火还有0.5秒,距离上次开火还有1.5秒。我们暂停游戏,让计时器失效。然后我们启动一个新的计时器,在开火前再等待2秒,现在距离上次开火已经3.5秒了,因此产生了不一致性。