我正在创建一个用户可以移动SKShapeNode
的游戏。现在,我正在尝试编写一个实用函数,它将按顺序执行背对背动画。
我首先将dispatch_async发送到串行线程。然后,该线程调用主线程上的dispatch_sync来执行动画。现在,为了使动画顺序运行,我想阻止GlobalSerialAnimationQueue
直到动画在主线程上完成。通过这样做,我(理论上)将能够顺序运行动画。我的代码粘贴在下面以获取更多说明
func moveToCurrentPosition() {
let action = SKAction.moveTo(self.getPositionForCurrRowCol(), duration: 1.0)
dispatch_async(GlobalSerialAnimateQueue) {
//this just creates an action to move to a point
dispatch_sync(GlobalMainQueue, {
self.userNode!.runAction(action) {
//inside the completion block now want to continue
//WOULD WANT TO TRIGGER THREAD TO CONTINUE HERE
}
})
//WOULD LIKE TO PAUSE HERE, THIS BLOCK FINISHING ONLY WHEN THE ANIMATION IS COMPLETE
}
}
所以,我的问题是,我如何编写一个可以接收动画请求的函数,然后按顺序执行它们?我应该使用哪些大中央调度工具,或者我应该尝试一种完全不同的方法?
答案 0 :(得分:1)
我想出了如何使用宏中心调度信号量来实现这一点。我的更新代码就在这里。
func moveToCurrentPosition() {
let action = SKAction.moveTo(self.getPositionForCurrRowCol(), duration: Animation.USER_MOVE_DURATION)
dispatch_async(GlobalSerialAnimateQueue) {
let semaphore = dispatch_semaphore_create(0)
dispatch_sync(GlobalMainQueue, {
self.userNode!.runAction(action) {
//signal done
dispatch_semaphore_signal(semaphore)
}
})
//wait here...
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER)
}
}
答案 1 :(得分:1)
SpriteKit提供了一个更简单直观的API,用于按顺序运行操作。请查看文档here。
您可以简单地将操作作为一系列事件执行,其间有块或完成:
let action = SKAction.moveTo(self.getPositionForCurrRowCol(), duration: Animation.USER_MOVE_DURATION)
let otherAction = SKAction.runBlock({
//Perform completion here.
})
self.userNode!.runAction(SKAction.sequence([action, otherAction]))