Spritekit SKShapeNode Рандомизированная шкала, Swift - PullRequest
0 голосов
/ 15 октября 2018

Как бы я сделал масштаб SKShapeNode в случайных размерах навсегда, не превышая максимальный размер набора и не меньше минимального установленного размера?

1 Ответ

0 голосов
/ 17 октября 2018

Один из способов сделать это (если я правильно понимаю ваш вопрос) - это иметь 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
}
...