Измените SKAction.wait (forDuration:) в последовательности - PullRequest
0 голосов
/ 03 сентября 2018

У меня есть это. Он работает, но теперь я должен изменить 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))

Большое спасибо.

1 Ответ

0 голосов
/ 04 сентября 2018

Я не уверен, почему вы запускаете действия на своей сцене для выполнения действий, вместо этого вы должны выполнять свои действия на определенных узлах. Но, тем не менее, после того, как вы назначите последовательность, вы не сможете изменить действия внутри нее, насколько мне известно. Это означает, что вы должны удалить последовательность и назначить новую последовательность с новой продолжительностью ожидания.

Или ты?

В случае, подобном вашему, можно манипулировать свойством 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))
...