запускать цикл в update () spritekit, редко, эффективно: способ?

#swift #sprite-kit

#swift #sprite-kit

Вопрос:

Чтобы представить кучу узлов, по одному на кадр, пока все они не появятся на экране, я думаю сделать что-то подобное в вызове update().

Предупреждение, псевдокод приближается:

 update(){

switch presentNodes_inOrderOfArrayIndex {

case on
  if indexPostion less than arrayOfNodes length
    run Action to present node pulled from indexPostion in arrayOfNodes
    increment indexPosition by 1
  else presentNodes_inOrderOfArrayIndex.OFF
return

case default
return

}
  

Но это редко включается и делает эту презентацию как повторную презентацию. Таким образом, в 99,999% случаев он выполняет ненужную проверку через этот переключатель.

Есть ли способ достичь этого, не помещая что-либо в update (), которое вызывается каждый отдельный кадр жизни игры, а вместо этого активно и выполняет свое дело только тогда, когда это необходимо?

Комментарии:

1. Откуда этот вызов обновления?

2. Мне просто интересно, какой смысл добавлять узлы по одному на кадр? Я имею в виду, зачем вам это нужно? @Confused

3. @Whirlwind, чтобы они отображались на экране в последовательности, довольно быстро, а не просто выводились на экран все сразу.

4. @MobileBen это обновление в сцене, одна из функций gameloop.

5. @MobileBen Я думаю, что обновление gameloop в файле сцены — единственное, доступное в SpriteKit, в отличие от многих других движков, которые могут переопределять их и вызывать для многих различных типов объектов.

Ответ №1:

Да, этот код внутри update следует удалить.

Вы можете попробовать это

 class GameScene: SKScene {

    let nodesToAdd: [SKNode] = []

    func startAddingNodes() {

        var index = 0
        let add = SKAction.run { [unowned self] in
            self.addChild(self.nodesToAdd[index])
            index  = 1
        }
        let wait = SKAction.wait(forDuration: 0.016)
        let sequence = SKAction.sequence([add, wait])
        let repeatSequence = SKAction.repeat(sequence, count: nodesToAdd.count)

        self.run(repeatSequence)
    }

}
  

Теперь все, что вам нужно сделать, это вызвать startAddingNodes только один раз.

Комментарии:

1. Здравствуйте, appzYourLife, извините, но вы уверены, что это работает «по одному на кадр»? Должно ли это быть допустимым только для 1/60 кадров?. Также SpriteKit не знает, сколько кадров будет за секунду, поэтому единственным способом должен быть метод обновления. P.S. Я видел ваш блог, отличный работник, хороший проект.

2. @AlessandroOrnano: Хорошая мысль! На самом деле я не могу гарантировать "one per frame" часть. Это всего лишь приближение.

3. Это действительно служит моей цели. Я действительно не рассматривал «злоупотребление» forDuration такими низкими числами. Но это похоже на отличное злоупотребление ими 😉

4. Вы всегда можете отслеживать свои кадры с помощью простой переменной, а затем использовать customAnimation, который длится вечно, вместо repeat. С помощью проверки frame — previous_known_frame вы можете определить, сколько циклов обновления прошло, и добавить соответствующее количество элементов, как только вы достигнете цели, удалите пользовательское действие

5. @Knight0fDragon: Без написания кода внутри update метода?