我必须运行添加两个精灵并移动,称为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")]))
答案 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)
})