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()
}