等到功能完成

时间:2015-02-18 23:13:56

标签: swift sprite-kit

我必须运行添加两个精灵并移动,称为Space1和Space2。在空间1完成移动后,我需要让Space1从右向左移动。然后,Space2将从左向右移动。

我可以通过2个函数Move1()和Move2()来移动它们;但他们同时开始。 如何使Space2等待,直到Space1的函数Move1完成,然后Space2开始移动?

这是我的代码

// Create sprite
        let space1 = SKSpriteNode(imageNamed: "Spaceship")
        space1.position = CGPoint(x: 0, y: frame.height/2)
        space1.xScale = 0.3;
        space1.yScale = 0.3;
        space1.name = "space1";
        self.addChild(space1);

        let space2 = SKSpriteNode(imageNamed: "Spaceship")
        space2.position = CGPoint(x: frame.width, y:0)
        space2.xScale = 0.3;
        space2.yScale = 0.3;
        space2.name = "space2";
        self.addChild(space2);

        let actualDuration = random(min: CGFloat(1), max: CGFloat(3))
        // Create the actions
        let actionMove1 = SKAction.moveTo(CGPoint(x: frame.width, y: frame.height/2), duration: NSTimeInterval(actualDuration))

        let actionMove2 = SKAction.moveTo(CGPoint(x: 0, y: 0), duration: NSTimeInterval(actualDuration))


        self.runAction(SKAction.sequence([SKAction.runAction(actionMove1, onChildWithName: "space1"),SKAction.runAction(actionMove2, onChildWithName: "space2")]))

2 个答案:

答案 0 :(得分:2)

SpriteKit提供了一个名为SKAction.sequence的东西。您可以为它提供一系列操作,这些操作将在之前的操作完成之后启动:

func startAction(){
    var space1 = SKSpriteNode()
    var space2 = SKSpriteNode()
    var move1 = SKAction()
    var move2 = SKAction()

    space1.name = "space1"
    space2.name = "space2"

    self.runAction(SKAction.sequence([SKAction.runAction(move1, onChildWithName: "space1"), SKAction.runAction(move2, onChildWithName: "space2")]))
}

如您所见,我为SKSpriteNodes添加了名称。这很重要,因为正如您在序列中看到的那样,您必须指定调用操作的节点。

同样重要的是,如果您使用子序列,则需要使用SKAction.waitForDuration(sec: NSTimeInterval)。例如:

self.runAction(SKAction.sequence([SKAction.runAction(move1, onChildWithName: "space1"), SKAction.waitForDuration(move1.duration), SKAction.runAction(move2, onChildWithName: "space2")]))}

答案 1 :(得分:2)

您可以使用runAction函数的完成处理程序来获取所需内容。在第一个SKAction函数的completion handler内开始下一个runAction

space1.runAction(actionMove1, completion: { () -> Void in
    space2.runAction(actionMove2)
})