2014-12-30 37 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我明白你的意思了,我已經更新了我的答案。 –