2016-05-11 23 views
-1

我的問題:在一個函數中聲明的NSTimer()會影響另一個函數。NSTimer的範圍()

我正在製作一個簡單的RPG遊戲,允許兩個玩家互相對抗。遊戲有一個文本框,其中顯示一秒消息,例如「玩家一次攻擊」等。遊戲結束後,文本框應打印出勝利者並將消息留在文本字段中。爲了解決第一部分(顯示一個消息,一秒後顯示一個空字符串),我做了如下代碼:

func printEmpty() { 
    textToDisplayLabel.text = "" 
} 
    func announcer(player: Character) { 
    var timer = NSTimer() 
    textToDisplayLabel.text = "\(player.name) attacks" 
    timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: "printEmpty", userInfo: nil, repeats: false) 

} 

要解決的第二部分(顯示有關贏家的信息,並把它在文本字段)我用:

func hideAfterAPlayerHasWon(winner: Character) { 
    leftPlayerAttackButton.hidden = true 
    rightPlayerAttackButton.hidden = true 
    leftPlayerHpLabel.hidden = true 
    rightPlayerHpLabel.hidden = true 
    leftPlayerNameLabel.hidden = true 
    rightPlayerNameLabel.hidden = true 

    if winner.side == Character.playerSide.left { 
     soldierMain.hidden = true 
     let centerXConst = NSLayoutConstraint(item: orcMain, attribute: .CenterX, relatedBy: .Equal, toItem: self.view, attribute: .CenterX, multiplier: 1, constant: 1) 
     let centerYConst = NSLayoutConstraint(item: orcMain, attribute: .CenterY, relatedBy: .Equal, toItem: self.view, attribute: .CenterY, multiplier: 1, constant: 1) 
     self.view.addConstraint(centerXConst) 
     self.view.addConstraint(centerYConst) 
     textToDisplayLabel.text = "\(leftPlayer.name) has won" 

    } else { 
     orcMain.hidden = true 
     let centerXConst = NSLayoutConstraint(item: soldierMain, attribute: .CenterX, relatedBy: .Equal, toItem: self.view, attribute: .CenterX, multiplier: 1, constant: 1) 
     let centerYConst = NSLayoutConstraint(item: soldierMain, attribute: .CenterY, relatedBy: .Equal, toItem: self.view, attribute: .CenterY, multiplier: 1, constant: 1) 
     self.view.addConstraint(centerXConst) 
     self.view.addConstraint(centerYConst) 
     textToDisplayLabel.text = "\(rightPlayer.name) has won" 
    } 

}

是,當遊戲開始時,有關的行動信息,例如「玩家攻擊」等顯示的問題,他們在一秒鐘後躲,因爲我希望他們要做的事情,但關於獲勝者的信息就像你的行爲一樣ght定時器只在播音員功能中聲明。所以問題發生在我身上:NSTimer()的範圍是什麼,我該如何解決這個問題?

編輯:在這裏播音員被稱爲(以及hideAfter ...)什麼的NSTimer()的範圍功能

@IBAction func onLeftPlayerAttackPressed(sender: UIButton) { 
    if leftPlayer.type == Character.charType.orc { 
     playOrcSlash() 
    } 
    if leftPlayer.type == Character.charType.soldier { 
     playSoldierSlash() 
    } 
    announcer(leftPlayer) 
    updateHp(leftPlayer, defender: rightPlayer) 
    disableButton(leftPlayerAttackButton) 
    if !(rightPlayer.isAlive) { 
     hideAfterAPlayerHasWon(leftPlayer) 
    } 
} 
+0

你能告訴我們你在哪裏叫你的函數'播音員(播放器:字符)'嗎? – Chajmz

+0

我編輯帖子並添加了這個信息,謝謝。 –

回答

0

它沒有一個「範圍」。一旦你安排了它,它就屬於擁有它的NSRunLoop並負責發射它。如果它是一個不重複的計時器,它在發射後就不存在了。

這與您的問題無關。你有一個基本的邏輯錯誤:

  1. onLeftPlayerAttackPressed設置定時器(announcer(leftPlayer)),並調用hideAfterAPlayerHasWon

  2. 然後hideAfterAPlayerHasWon在標籤中顯示「player has won」。

  3. 然後計時器再次啓動並清空標籤!所以你確信你的計時器已經解僱

    延遲調用你的函數hideAfterAPlayerHasWon由一個或兩個第二名:

0

事實上你的標籤後,你的計時器觸發更新,你可以做什麼。

if !(rightPlayer.isAlive) { 
    let yourDelayTime = (Int64(NSEC_PER_SEC) * NUMBER_SECOND_DELAY) 
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, yourDelayTime), dispatch_get_main_queue(), {() -> Void in 
    self.hideAfterAPlayerHasWon(leftPlayer) 
    }) 
}