#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
метода?