2016-02-19 59 views
1

我正在研究一個簡單的紙牌遊戲,其中一個玩家按下一個按鈕後,三臺AI計算機會一個接一個地輪流。但是,我需要在每個回合之間停下來。Swift中的多重延遲

這就是我需要:

playerButton> PAUSE> computer1Goes> PAUSE> computer2Goes> PAUSE> computer3Goes

代碼:

@IBAction func placeCardAction(sender: UIButton) { 

    // playerButton does this action 
    var playerCardOnTop = game!.player.deck.placeCard() 
    middleDeck.addSingleCard(playerCardOnTop) 
    updateCardCount() 

    // Start computer actions 
    let delay = 2.0 * Double(NSEC_PER_SEC) 
    let time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay)) 
    dispatch_after(time, dispatch_get_main_queue()) { 
     self.game?.computer1PlacesCard(&self.middleDeck) 
     self.updateCardCount() 
    } 

    let delay2 = 2.0 * Double(NSEC_PER_SEC) 
    let time2 = dispatch_time(DISPATCH_TIME_NOW, Int64(delay)) 
    dispatch_after(time2, dispatch_get_main_queue()) { 
     self.game?.computer2PlacesCard(&self.middleDeck) 
     self.updateCardCount() 
    } 

    let delay3 = 2.0 * Double(NSEC_PER_SEC) 
    let time3 = dispatch_time(DISPATCH_TIME_NOW, Int64(delay)) 
    dispatch_after(time3, dispatch_get_main_queue()) { 
     self.game?.computer3PlacesCard(&self.middleDeck) 
     self.updateCardCount() 
    } 
} 

不幸的是,所有的延遲啓動/在同一時間結束,所以最終發生的是所有的計算機功能同時運行,而不是一個接一個地輪流。

如果有人能幫助解決這個問題,我將不勝感激!

回答

0

最簡單的解決方案....將delay2更改爲4,將delay3更改爲6.現在看來,它們當然都是同時熄滅,所有延遲都相同。

或者,它們疊放喜歡:

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(delay))) { 
    // step one 
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(delay))) { 
     // step two 
     ... 
    } 
} 
+0

我試着堆疊它們,但它仍然一次運行所有它們。我還在dispatch_after的參數中包含了dispatch_get_main_queue,因爲如果沒有它,程序將不會運行。 – Michael

0

我建議使用計算機對象的數組,它可以執行placeCard功能

@IBAction func placeCardAction(sender: UIButton) { 

    // playerButton does this action 
    var playerCardOnTop = game!.player.deck.placeCard() 
    middleDeck.addSingleCard(playerCardOnTop) 
    updateCardCount() 

    self.computersPlaceCards(0) 
} 

private func computersPlaceCards(i: Int) { 
    if self.game == nil || i >= self.game!.computers.count { 
     return 
    } 

    let delay = 2.0 * Double(NSEC_PER_SEC) 
    let time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay)) 
    dispatch_after(time, dispatch_get_main_queue()) { 
     self.game?.computers[i].placeCards(&self.middleDeck) 
     self.updateCardCount() 

     self.computersPlaceCards(i+1) 
    } 
} 
0

可以使用sleep()一個dispatch_async內:

dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INTERACTIVE, 0)) { 
    dispatch_async(dispatch_get_main_queue()) { 
     print("first") 
    } 
    sleep(1) 
    dispatch_async(dispatch_get_main_queue()) { 
     print("second") 
    } 
    sleep(1) 
    dispatch_async(dispatch_get_main_queue()) { 
     print("third") 
    } 
    sleep(1) 
    dispatch_async(dispatch_get_main_queue()) { 
     print("fourth") 
    } 
} 

(我的回答以前用過NSOperationQueue - e ither會工作)