如何在Swift中同时运行定时器和AI逻辑

时间:2015-08-07 09:12:47

标签: swift sprite-kit artificial-intelligence nstimer

我有一个NSTimer()和一个用于棋盘游戏的AI逻辑。 AI逻辑需要很长时间才能处理大约3到5秒(这没关系)。当程序执行AI逻辑时,NSTimer在AI逻辑完成执行之前不会触发。

这就是我在比赛初期启动计时器的方式。

    public var timer = NSTimer()

...

    let timeSelector:Selector = "timerFired"
    if self.useTime {
       timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: timeSelector, userInfo: nil, repeats: true)
    }

我在更新SKScene中添加了AI逻辑,这样当它检测到轮到他时,他将开始检查可用的移动

override func update(currentTime: CFTimeInterval) {
      if gameStatus.playerTurn == "AI" && !aiThiking {
         aiThiking = true
         aIPlayer.aiCheckAvaialbleMoves()
         // executeMove
         // change Turn
         aiThiking = false
      }

我的问题是,是否可以让AI逻辑执行并让计时器同时运行?

1 个答案:

答案 0 :(得分:0)

您的问题似乎是aIPlayer.aiCheckAvailableMoves()冻结应用程序,只要它执行,所以NSTimer不能正常工作。您可以使用不同的threads来避免这种情况:

dispatch_async(dispatch_get_global_queue(priority, 0)) {
    aIPlayer.aiCheckAvaialbleMoves()
}

此代码在新线程中运行此函数,当代码结束时,线程自动关闭。

您可以使用完成块来确切知道函数何时结束。这是一个例子:

func aiCheckAvailableMoves(completion : (result : BOOL) -> Void) {
   dispatch_async(dispatch_get_global_queue(priority, 0)) {
       //Do your code normally

       //When you have finished, call the completion block (like a return)
       completion(true)
   }
}

然后,从你的update:开始,你会在功能结束时得到(请注意这里没有dispatch_async):

aIPlayer.aiCheckAvailableMoves(){
    //Finished checking moves, maybe schedule again?
}

小心线程,因为它们可能导致不必要的行为或/和崩溃!