spritekit 如何在两个不同的节点上转换两个 SKAction
spritekit how to transition two SKAction on two different nodes
我有两个节点node1 和node2。 node1 位于位置 0。当我单击屏幕时,它 运行 它的动作直到它位于屏幕中间或用户将手指从屏幕上移开。一旦 node1 到达屏幕中间,它将停止,而 node2 将 运行 它的动作。到目前为止,我的代码是这样做的。
但是,为了让 node2 运行 执行其操作,用户必须将手指从屏幕上移开并再次触摸它。我不希望这种情况发生。我希望在 node1 完成后用户将手指从屏幕上移开的情况下,node2 的操作为 运行。
基本上,用户按住屏幕 node1 运行s 的操作完成,然后 node2 运行s 的操作。
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
let Node1Move=SKAction.moveBy(x:50,y:0,duration:0.6)
let node1rep=SKAction.repeatForever(Node1Move)
node1.run(node1rep)
if modeNode2==1{
let node2move=SKAction.moveBy(x:-10,y:0,duration:0.9)
let node2Rep=SKAction.repeatForever(node2move)
node2.run(node2Rep)
}
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
node1.removeAllActions()
node2.removeAllActions()
}
override func update(_ currentTime: TimeInterval) {
if node1.position.x+node1.frame.width > self.frame.width/2{
node1.removeAllActions()
moveNode2=1
}
}
touchesBegin 只会触发一次,因此您的 moveNode2 == 1 不会执行任何操作。而不是使用 moveBy,用户 moveTo,并让 node1 moveTo 屏幕中心 - node1 宽度。然后只需向 node1.run 添加一个完成块。
注意:您可能需要更改时长,不确定这些数字的来源。如果您计划让用户不断点击屏幕,那么只需 totalDuration = 3 * (node1.x - 'node1 start x')/((self.frame.width/2 - node1.frame.width) - 'node1 start x')
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
let Node1Move=SKAction.moveTo(x:self.frame.width/2 - node1.frame.width,y:0,duration:3.0)
node1.run(Node1Move)
{
let node2move=SKAction.moveBy(x:-10,y:0,duration:0.9)
let node2Rep=SKAction.repeatForever(node2move)
node2.run(node2Rep)
}
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
node1.removeAllActions()
node2.removeAllActions()
}
我有两个节点node1 和node2。 node1 位于位置 0。当我单击屏幕时,它 运行 它的动作直到它位于屏幕中间或用户将手指从屏幕上移开。一旦 node1 到达屏幕中间,它将停止,而 node2 将 运行 它的动作。到目前为止,我的代码是这样做的。
但是,为了让 node2 运行 执行其操作,用户必须将手指从屏幕上移开并再次触摸它。我不希望这种情况发生。我希望在 node1 完成后用户将手指从屏幕上移开的情况下,node2 的操作为 运行。
基本上,用户按住屏幕 node1 运行s 的操作完成,然后 node2 运行s 的操作。
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
let Node1Move=SKAction.moveBy(x:50,y:0,duration:0.6)
let node1rep=SKAction.repeatForever(Node1Move)
node1.run(node1rep)
if modeNode2==1{
let node2move=SKAction.moveBy(x:-10,y:0,duration:0.9)
let node2Rep=SKAction.repeatForever(node2move)
node2.run(node2Rep)
}
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
node1.removeAllActions()
node2.removeAllActions()
}
override func update(_ currentTime: TimeInterval) {
if node1.position.x+node1.frame.width > self.frame.width/2{
node1.removeAllActions()
moveNode2=1
}
}
touchesBegin 只会触发一次,因此您的 moveNode2 == 1 不会执行任何操作。而不是使用 moveBy,用户 moveTo,并让 node1 moveTo 屏幕中心 - node1 宽度。然后只需向 node1.run 添加一个完成块。
注意:您可能需要更改时长,不确定这些数字的来源。如果您计划让用户不断点击屏幕,那么只需 totalDuration = 3 * (node1.x - 'node1 start x')/((self.frame.width/2 - node1.frame.width) - 'node1 start x')
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
let Node1Move=SKAction.moveTo(x:self.frame.width/2 - node1.frame.width,y:0,duration:3.0)
node1.run(Node1Move)
{
let node2move=SKAction.moveBy(x:-10,y:0,duration:0.9)
let node2Rep=SKAction.repeatForever(node2move)
node2.run(node2Rep)
}
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
node1.removeAllActions()
node2.removeAllActions()
}