Ios Swift:NSTimer替代方案
我制作了一个flappy bird克隆,但在尝试实现暂停功能时,我遇到了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语句,检查游戏是否暂停,如果暂
var timer = NSTimer.scheduledTimerWithTimeInterval(moveSpeed, target: self, selector: Selector("makePipes"), userInfo: nil, repeats: true)
由于NSTimer不能暂停,我在makePipes()函数中实现了一个简单的if语句,检查游戏是否暂停,如果暂停,则不生成新的管道。但是,由于计时器在暂停状态期间仍在启动,因此每个管道系列之间的间隙不一致
此外,当从菜单转换到游戏状态时,计时器会触发时间,快速连续地创建前两个管道
是否有替代NSTimer的方法来处理此功能?您可以在游戏暂停时停止调用
func invalidate()
的计时器,然后在游戏取消暂停时重新启动它
更新:
您可以添加第二个计时器,该计时器在与下一次点火和暂停时间不同时触发,第二个计时器应触发第一个计时器,然后将第一个计时器重置为初始时间
步骤:
定时器.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秒了,因此产生了不一致性。