我有一个 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 逻辑,以便当它检测到轮到他时,他将开始检查可用的 Action
override func update(currentTime: CFTimeInterval) {
if gameStatus.playerTurn == "AI" && !aiThiking {
aiThiking = true
aIPlayer.aiCheckAvaialbleMoves()
// executeMove
// change Turn
aiThiking = false
}
我的问题是,有没有可能让AI逻辑执行的同时让定时器还在运行?
最佳答案
您的问题似乎是 aIPlayer.aiCheckAvailableMoves()
会在应用程序执行时卡住应用程序,因此 NSTimer
无法正常工作。您可以使用不同的线程
来避免这种情况:
dispatch_async(dispatch_get_global_queue(priority, 0)) {
aIPlayer.aiCheckAvaialbleMoves()
}
此代码在新线程中运行此函数,当代码结束时,线程会自动关闭。
您可以使用完成 block 来准确知道函数何时结束。这是一个例子:
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?
}
小心线程,因为它们可能导致意外行为或/和崩溃!
关于swift - 如何在 Swift 中同时运行定时器和 AI 逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31873919/