按顺序执行未知数量的动画

时间:2016-05-16 04:44:18

标签: ios swift sprite-kit grand-central-dispatch skaction

我正在创建一个用户可以移动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
    }
}

所以,我的问题是,我如何编写一个可以接收动画请求的函数,然后按顺序执行它们?我应该使用哪些大中央调度工具,或者我应该尝试一种完全不同的方法?

2 个答案:

答案 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]))