按顺序更改SKAction.wait(forDuration :)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了按顺序更改SKAction.wait(forDuration :)相关的知识,希望对你有一定的参考价值。

我有这个。它运行,但现在我必须改变forDuration: 10可能5。在动作序列中有4个精灵,它们在给定时间内移动它们的路径。一旦我运行序列,我就无法改变forDuration: 10

是谁在那里,谁可以帮助我?

let s1_1 = SKAction.run{let unit = S1(); unit.gegnerSpeed = 100; unit.moveAlongPath(self.pfadGegner);self.addChild(unit)}
let s1_2 = SKAction.run{let unit = S1(); unit.gegnerSpeed = 80; unit.moveAlongPath(self.pfadGegner);self.addChild(unit)}


let action1 = SKAction.sequence([
                s1_1, SKAction.wait(forDuration: 10),
                s1_2, SKAction.wait(forDuration: 10),
                s1_1, SKAction.wait(forDuration: 10),
                s1_2, SKAction.wait(forDuration: 10)    ])
            let sequenz = SKAction.sequence([action1, SKAction.run {
                self.letzterGegnerLos = true
                }])
            run(SKAction.repeat(sequenz, count: 1))

非常感谢。

答案

我不确定为什么要在场景中运行操作来运行操作,您应该在特定节点上执行操作。但是说,一旦你分配了一个序列,就我所知,你无法改变它内部的动作。这意味着您必须删除序列,并为新序列分配新的等待持续时间。

或者你呢?

在像您这样的情况下,可以操纵动作或节点的speed属性。要操纵动作的速度,您需要使用node.action(forKey:"key")提取动作。唯一的问题是,你操纵序列内所有动作的速度。

相反,让我们改变节点的速度。

为此,我建议使用变量来指定速度:

let dSpeed = 1
let action1 = SKAction.sequence([

            s1_1,
            SKAction.run{[unowned self] in self.speed = dSpeed}, 
            SKAction.wait(forDuration: 10),
            SKAction.run{[unowned self] in self.speed = 1}, 
            s1_2,
            SKAction.run{[unowned self] in self.speed = dSpeed}, 
            SKAction.wait(forDuration: 10),
            SKAction.run{[unowned self] in self.speed = 1},
            s1_1, 
            SKAction.run{[unowned self] in self.speed = dSpeed},
            SKAction.wait(forDuration: 10),
            SKAction.run{[unowned self] in self.speed = 1},
            s1_2, 
            SKAction.run{[unowned self] in self.speed = dSpeed},
            SKAction.wait(forDuration: 10),
            SKAction.run{[unowned self] in self.speed = 1}    ])
        let sequenz = SKAction.sequence([action1, SKAction.run {
            self.letzterGegnerLos = true
            }])
        run(SKAction.repeat(sequenz, count: 1))

当然,现在我们遇到了运行速度快的问题。这就是为什么我质疑为什么你在你的场景上运行的东西。

从代码的外观来看,您需要一个产生节点来产生单位。让我们创造它。

lazy var spawnNode = {
                         [unowned self] in
                         let node = SKNode()
                         self.addChild(node)
                         return node
                     }()

一旦您访问spawnNode,它将创建它并将其添加到场景中。

接下来,我们设置您的产卵功能。

func spawn(_ speed:int)
{
    let unit = S1()
    unit.gegnerSpeed = speed
    unit.moveAlongPath(self.pfadGegner)
    self.addChild(unit)
}

最后,让我们设置你的行动

let s1_1 = SKAction.run{spawn(100)}
let s1_2 = SKAction.run{spawn(80)}
let dSpeed = 1
let action1 = SKAction.sequence([

            s1_1,
            SKAction.run{spawnNode.speed = dSpeed}, 
            SKAction.wait(forDuration: 10),
            SKAction.run{spawnNode.speed = 1}, 
            s1_2,
            SKAction.run{spawnNode.speed = dSpeed}, 
            SKAction.wait(forDuration: 10),
            SKAction.run{spawnNode.speed = 1},
            s1_1, 
            SKAction.run{spawnNode.speed = dSpeed},
            SKAction.wait(forDuration: 10),
            SKAction.run{spawnNode.speed = 1},
            s1_2, 
            SKAction.run{spawnNode.speed = dSpeed},
            SKAction.wait(forDuration: 10),
            SKAction.run{spawnNode.speed = 1}    ])
        let sequenz = SKAction.sequence([action1, SKAction.run {
            self.letzterGegnerLos = true
            }])
        run(SKAction.repeat(sequenz, count: 1))

现在,如果我们希望节点生成速度快两倍,我们就会执行dSpeed = 2。如果我们希望节点生成两倍慢,我们做dSpeed = 0.5。通过这种方式,我们不会以任何方式操纵场景的速度。

只是一个注释,我在运行块之前和之后而不是在序列的开始和结束时进行速度更改的原因是以防万一你需要做任何动画。现在设置代码的方式,立即运行块,所以你可以在开始时设置dSpeed,在结束时设置1。但是如果出于某种原因,在生成节点后立即执行移动操作,则该移动操作将使用spawn节点的速度。所以,如果你只是要做跑块,那么这是可以接受的。

let action1 = SKAction.sequence([
        SKAction.run{spawnNode.speed = dSpeed}, 
        s1_1,     
        SKAction.wait(forDuration: 10),
        s1_2,
        SKAction.wait(forDuration: 10),
        s1_1, 
        SKAction.wait(forDuration: 10),
        s1_2, 
        SKAction.wait(forDuration: 10),
        SKAction.run{spawnNode.speed = 1}    ])
    let sequenz = SKAction.sequence([action1, SKAction.run {
        self.letzterGegnerLos = true
        }])
    run(SKAction.repeat(sequenz, count: 1))

以上是关于按顺序更改SKAction.wait(forDuration :)的主要内容,如果未能解决你的问题,请参考以下文章

SKAction 播放声音不是从头开始的

自己。在尾随迅速关闭,意义和目的?

为啥“HTML 文件选择”会更改所选文件的顺序并按字母顺序排序?

更改全局环境以按数字顺序读取

按 mongoose-aggregate-paginate-v2 更改顺序排序

使用 tie 元素按值排序字典不应更改其顺序