2016-02-19 5 views
1

Я работаю над простой карточной игрой, в которой после того, как игрок нажмет кнопку, три компьютера с искусственным интеллектом будут поочередно поворачиваться. Тем не менее, мне нужно, чтобы между паузами была пауза.Несколько задержек в 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() 
    } 
} 

К сожалению, все задержки запуска/end в одно и то же время, поэтому все, что происходит, состоит в том, что все компьютерные функции работают одновременно, а не поочередно, один за другим.

Если кто-нибудь может помочь решить эту проблему, я был бы признателен!

ответ

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_get_main_queue в параметр dispatch_after, потому что программа не запускалась без него. – 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") 
    } 
} 

(Мой ответ ранее использовался NSOpe rationQueue - либо будет работать)