2015-06-26 5 views
0

Я довольно новичок в программировании на iOS. У меня есть функция в моей игровой сцене, которая перемещает массив SKSpriteNodes. После того как каждое перемещение завершено, его узел должен быть удален со сцены. Функция также имеет функцию завершения, которую следует называть ПОСЛЕ удаления всех SKNodes. Мой вопрос в том, что если есть более чистый способ просто добавить немного дополнительного времени к длительности движения moveAction до тех пор, пока не будет вызвана функция завершения (см. Ниже). Я также играл с последовательностями действий, но не мог найти рабочего решения ...Правильно обнаружить завершение одновременных SKActions

Всякая помощь будет оценена!

func animateNodes(nodes: Array<SKSpriteNode>, completion:() ->()) { 
    let duration = NSTimeInterval(0.5) 
    for (_, node) in nodes.enumerate() { 
     let point = CGPointMake(node.position.x - 80, node.position.y + 80) 
     let moveAction = SKAction.moveTo(point, duration: duration) 
     let fadeOutAction = SKAction.fadeAlphaTo(0, duration: duration) 
     node.runAction(SKAction.group([moveAction, fadeOutAction]), completion: { 
      node.removeFromParent() 
     }) 
    } 
    runAction(SKAction.waitForDuration(duration + 0.1), completion:completion) 
} 

ответ

1

Добавить переменную count, которая отслеживает, сколько узлов в настоящее время живы. В завершении каждого узла, декремент, что рассчитывать и проверить, если это был последний один (count == 0) и запустить действие завершения, если она:

func animateNodes(nodes: Array<SKSpriteNode>, completion:() ->()) { 
    var count = nodes.count 
    let duration = NSTimeInterval(0.5) 
    for (_, node) in nodes.enumerate() { 
     let point = CGPointMake(node.position.x - 80, node.position.y + 80) 
     let moveAction = SKAction.moveTo(point, duration: duration) 
     let fadeOutAction = SKAction.fadeAlphaTo(0, duration: duration) 
     node.runAction(SKAction.group([moveAction, fadeOutAction]), completion: { 
      node.removeFromParent() 
      count-- 
      if count == 0 { 
       completion() 
      } 
     }) 
    } 
} 

Я не компилируется или запустить это, так что могут быть ошибки, но это должно работать

+0

Это хорошая идея! Я думал, что будет возможность как-то запустить все действия сразу и вызвать функцию после завершения всех действий, но это решение отлично подходит и для меня, спасибо! ;) – biedert

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