2015-04-19 3 views
2

Я хочу изменить значение переменной после того, как действие было выполнено, а не во время его запуска. Это мой код:Обнаружение, если SKAction выполняется, Swift

override func touchesEnded(touches: Set<NSObject>, withEvent event: UIEvent) { 

    if gameNotStarted { 
     if firePosition.x != 320 || firePosition.y > 280 { 
      fire.runAction(fireButtonReturn) 
      iapButton.runAction(iapButtonReturn) 
      aboutButton.runAction(abtButtonReturn) 

      if fire.hasActions() == false { 
       println("has no actions") 
       firePosition.x = 320 
       firePosition.y = 280 
      } 
     }  
    } 
} 

три действия, которые я бегу точно такой же продолжительности, поэтому мне нужно только одно, чтобы проверить, как они закончили работу. По завершении работы я хочу изменить значение firePosition.x и firePosition.y. Очень важно, чтобы значения позиции огня изменялись точно после того, как действие было запущено, и абсолютно не до того, как действия будут выполнены.

Однако с моим текущим кодом я никогда не запускаю часть if fire.hasActions() ... в соответствии с результатами и консолью. Я нашел похожие вопросы, они были в obj-c. Спасибо за помощь.

ответ

6

Вы должны использовать завершающий обработчик для вашего рода проблема:

//Run the action 
iapButton.runAction(iapButtonReturn, 
    //After action is done, just call the completion-handler. 
    completion: { 
     firePosition.x = 320 
     firePosition.y = 280 
    } 
) 

Или вы могли бы использовать SKAction.sequence и добавить свои действия внутри SKAction.block:

var block = SKAction.runBlock({ 
    fire.runAction(fireButtonReturn) 
    iapButton.runAction(iapButtonReturn) 
    aboutButton.runAction(abtButtonReturn) 
}) 

var finish = SKAction.runBlock({ 
    firePosition.x = 320 
    firePosition.y = 280 
}) 

var sequence = SKAction.sequence([block, SKAction.waitForDuration(yourWaitDuration), finish]) 

self.runAction(sequence) 
+0

большое спасибо. Если бы я хотел быстро изменить действие, как бы я это сделал? – ecoguy

3

вы должны использовать обработчик завершения:

fire.runAction(fireButtonReturn, 
    completion: { 
     println("has no actions") 
     firePosition.x = 320 
     firePosition.y = 280 
    } 
) 

проблема с решением, что действие начинается с вызовом runAction, но затем работает в фоновом режиме, пока основной поток продолжает выполнение (и, следовательно, доходит до того, как действие закончено).

0
extension SKNode { 
    func actionForKeyIsRunning(key: String) -> Bool { 
     if self.actionForKey(key) != nil { 
      return true 
     } else { 
      return false 
     } 
    } 
} 

Вы можете использовать его:

if myShip.actionForKeyIsRunning("swipedLeft") { 
    print("swipe in action..") 
}