2014-12-29 3 views
1

Я пытаюсь выполнить повторяющуюся задачу, где я могу изменить задержку, в которой он повторяется. Вот текущий код, я использую:Изменение последовательности повторяющихся задач во время работы

var actionwait = SKAction.waitForDuration(self.wait) 
     var actionrun = SKAction.runBlock({ 
      self.count+=1 
      if (self.count % 2 == 0 && self.wait > 0.2){ 

       self.wait -= 0.1 
       actionwait.duration = self.wait 
      } 
      for node in self.children{ 
       if (node.isMemberOfClass(Dot)){ 
        node.removeFromParent() 
       } 
      } 
      var radius = CGFloat(arc4random_uniform(100) + 30) 
      var newNode = Dot(circleOfRadius: radius) 
      var color = self.getRandomColor() 
      newNode.fillColor = color 
      newNode.strokeColor = color 
      newNode.yScale = 1.0 
      newNode.xScale = 2.0 
      newNode.userInteractionEnabled = true 
      newNode.setScene(self) 
      newNode.position = newNode.randomPos(self.view!) 
      self.addChild(newNode) 

      }) 

     self.runAction(SKAction.repeatActionForever(SKAction.sequence([actionwait,actionrun]))) 

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

ответ

2

при создании actionwait он собирается сохранить значения внутри этого закрытия и продолжать использовать их в repeatActionForever

Когда вы отслеживаете изменения это лучше всего делать такого рода вещи в методе update. Использование действий в этом случае может оказаться не лучшим подходом.

Я не уверен, когда вы (для своей игры) должны проверять изменения. Для большинства вещей, используя метод update адекватна

Heres один способ я реализовать таймер обновления

// MY TIMER PROPERTIES IN MY CLASS 
var missleTimer:NSTimeInterval = NSTimeInterval(2) 
var missleInterval:NSTimeInterval = NSTimeInterval(2) 


// IN MY UPDATE METHOD 
self.missleTimer -= self.delta 

if self.missleTimer <= 0 { // TIMER HIT ZERO, DO SOMETHING! 
    self.launchMissle() // LAUNCH MY MISSLE 
    self.missleTimer = self.missleInterval // OKAY LETS RESET THE TIMER 
} 

дельта разность времени между этим кадром и последним кадром. Он используется для создания движения жидкости и отслеживания времени. Такие вещи. Это довольно стандартный среди проектов spritekit. обычно нужно использовать дельта projectwide

объявить эти два свойства:

// time values 
var delta:NSTimeInterval = NSTimeInterval(0) 
var last_update_time:NSTimeInterval = NSTimeInterval(0) 

Это должно быть как верхняя часть вашего метода обновления выглядит

func update(currentTime: NSTimeInterval) { 
    if self.last_update_time == 0.0 
     self.delta = 0 
    } else { 
     self.delta = currentTime - self.last_update_time 
    } 

    self.last_update_time = currentTime 
+0

Он обновляет перед каждым кадр делает, так это точный судья времени, который может изменить FPS? Я не уверен, как создать таймер с помощью метода обновления. Должен ли я сделать счетчик и добавить 1 каждый рендер кадра, пока он не достигнет определенного числа? – Kendel

+0

Что такое 'self.delta'? – Kendel

+0

Я добавил дополнительную информацию – hamobi

Смежные вопросы