2014-12-30 38 views
1

我做了一个飞扬的鸟克隆,但是当试图实现暂停功能时,我遇到了我的NSTimer问题,它产生了管道。Swift:NSTimer Alternative

var timer = NSTimer.scheduledTimerWithTimeInterval(moveSpeed, target: self, selector: Selector("makePipes"), userInfo: nil, repeats: true) 

由于NSTimers不能暂停时,makePipes()函数,我实现了一个简单的if语句,检查游戏是否暂停与否,如果是,不产生新的管道内。然而,由于定时器在暂停状态期间仍然发射,所以每个系列管道之间的差距不一致。

此外,从菜单转换到游戏状态时,定时器触发关闭时间,创造了连续快速的前两个管道。

是否有任何替代NSTimer来处理此功能?

+0

哦伪善,世界需要更多的“笨鸟先飞”的克隆,我们要赶上的“2048”克隆的绝对数量。对不起,无法抗拒:-) – paxdiablo

+2

为什么你不能停止计时器,并重新开始播放时再次启动它? –

+0

是的,就像@MidhunMP说的那样,当你暂停并在播放时重新安排一个新的计时器时就停止计时器 – Paulw11

回答

0

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

更新:

您可以添加触发在从下火和暂停的时间差第二定时器,第二定时器应触发第一个计时器,然后第一计时器重置为初始时间。

步骤:

  1. 添加可以说是激发每2秒

  2. 当游戏暂停计时器,计算从timer.fireDatetimeOfPause,时间间隔应该是intervalTillNextTrigger

  3. 添加触发在intervallTillNextTrigger,不应该重复

  4. 第二
  5. 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 
    } 

} 
+0

同样的问题会出现。例如:每2秒钟发射一次。它几乎要射击,比方说距离射击0.5秒,距离上次射击1.5秒。我们暂停游戏,使计时器无效。然后,我们开始一个新的定时器,在发射前等待另外2秒,现在距离上次发射已经过了3.5秒,因此产生了不一致。 – Lazdo

+0

@Lazdo我明白你的意思了,我已经更新了我的答案。 –