我有一个NSTimer()和一个用于棋盘游戏的人工智能逻辑。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逻辑执行和让计时器仍然在同一时间运行?
发布于 2015-08-07 09:33:54
您的问题似乎是,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?
}
小心线程,因为它们可能导致不必要的行为或/或崩溃!
https://stackoverflow.com/questions/31873919
复制相似问题