Один из способов сделать это (если я правильно понимаю ваш вопрос) - это иметь 3 свойства типа TimeInterval
, которые отслеживают, сколько времени прошло с момента последнего масштабирования спрайта, как часто спрайт должен масштабироваться (чтобудет инициализироваться как 0,5 с) и сколько времени займет действие масштаба (по умолчанию то же самое, что и время между шкалами):
var timeOfLastScale: CFTimeInterval = 0.0
var timePerScale: CFTimeInterval = 0.5
var scaleTime = timePerScale
Мы инициализируем время с последней шкалы до 0, поскольку оно не имеетслучилось еще.Я также использую timePerScale
в качестве продолжительности эффекта масштабирования, поэтому, как только он прекращает масштабирование, начинается новое действие масштабирования, то есть узел постоянно масштабируется.Они могут быть изменены в коде для получения различных эффектов.
Нам также нужны 2 свойства, которые определяют максимальный и минимальный размеры шкалы (от 0 до 100%) и вычисляемое свойство общего диапазона масштабирования (мы делаем этовычисляемое свойство, так что если вы изменяете максимальный или минимальный масштабные коэффициенты в своем коде, вам не нужно пересчитывать scaleRange):
var maxScale; UInt32 = 100
var minScale:UInt32 = 25
var scaleRange: Uint32 {
get {return maxScale - minScale}
}
(я предполагаю, что узел может масштабироваться между 25% и 100% от его нормального размера)
В update:
вызвать функцию, которая проверяет, прошел ли временной интервал шкалы.Если это так, то создайте и запустите новый SKAction для масштабирования узла и сброса времени с момента последнего масштабирования.
Если время шкалы еще не прошло, ничего не делать:
override func update(_ currentTime: TimeInterval) {
scaleNode(currentTime)
// Rest of update code
}
func scaleNode(_ currentTime: CFTimeInterval) {
timeSinceLastScale = currentTime - timeOfLastScale
if timeSinceLastScale < timePerScale {return}
// Time per scale has passed, so calculate a new scale actiona and re-scale the node...
let scaleFactor = Float(arc4random_uniform(scaleRange)+minScale)/100
let scaleAction = SKAction.scale(to: scaleFactor,duration: scaleTime)
nodeToBeScaled.run(scaleAction)
timeOfLastScoreDecrement = currentTime
}