Я не уверен, почему вы запускаете действия на своей сцене для выполнения действий, вместо этого вы должны выполнять свои действия на определенных узлах. Но, тем не менее, после того, как вы назначите последовательность, вы не сможете изменить действия внутри нее, насколько мне известно. Это означает, что вы должны удалить последовательность и назначить новую последовательность с новой продолжительностью ожидания.
Или ты?
В случае, подобном вашему, можно манипулировать свойством 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 в конце. Но если по какой-то причине вы поместите действие перемещения сразу после того, как вы создали узел, то это действие перемещения будет использовать скорость узла вызова. Так что, если вы собираетесь выполнять только блоки выполнения, это приемлемо.
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))