按顺序执行未知数量的动画
Performing an unknown amount of animations sequentially
我正在创建一个游戏,用户可以在其中移动 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
}
}
所以,我的问题是,我将如何编写一个函数来接受动画请求,然后按顺序执行它们?我应该使用什么 grand-central-dispatch 工具,或者我应该尝试一种完全不同的方法?
我想出了如何使用 grand-central-dispatch 信号量来做到这一点。我更新的代码在这里。
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)
}
}
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]))
我正在创建一个游戏,用户可以在其中移动 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
}
}
所以,我的问题是,我将如何编写一个函数来接受动画请求,然后按顺序执行它们?我应该使用什么 grand-central-dispatch 工具,或者我应该尝试一种完全不同的方法?
我想出了如何使用 grand-central-dispatch 信号量来做到这一点。我更新的代码在这里。
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)
}
}
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]))