2015-10-24 1 views
1

Я пытаюсь получить три функции для вызова, один за другим после каждого завершения определенного числа циклов.Как выполнять последовательные вызовы функций с помощью обработчика завершения в Swift на SKSpriteNode?

Мне удалось попытаться вызвать вторую функцию после завершения первой функции с завершением счета.

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

midGroundlevelMovingSlow (midGroundlevelMovingMedium (midGroundlevelMovingFast()))

не работает для трех функций, где, как:

midGroundlevelMovingSlow (midGroundlevelMovingMedium)

сделал работу за двоих.

Я попытался изменить скобки, добавив себя. и т.д. без успеха.

код, который я использовал для этих трех функций (медленный, средний и быстрый) является:

func midGroundlevelMovingSlow(completion: (()->Void)?) { 

    let moveLevelImage = SKAction.moveByX(-self.frame.size.width, y: 0, duration: gameSpeed) 
    let replaceLevelImage = SKAction.moveByX(self.frame.size.width, y: 0, duration: 0) 
    let movingAndReplacingLevelImage = SKAction.repeatAction(SKAction.sequence([moveLevelImage,replaceLevelImage]), count: 2) 

    var callCount = 2 

    mgImage.runAction(movingAndReplacingLevelImage){() -> Void in 
     if --callCount == 0 { 
      self.foreGroundLevelMovingMedium(self.foreGroundLevelMovingFast) 
     } 
    } 

    mgImage2.runAction(movingAndReplacingLevelImage){() -> Void in 
     if --callCount == 0 { 
      self.foreGroundLevelMovingMedium(self.foreGroundLevelMovingFast) 
     } 
    } 
} 

Последовал:

func midGroundlevelMovingMedium(completion: (()->Void)?) { 

    let moveLevelImage = SKAction.moveByX(-self.frame.size.width, y: 0, duration: gameSpeed/2) 
    let replaceLevelImage = SKAction.moveByX(self.frame.size.width, y: 0, duration: 0) 
    let movingAndReplacingLevelImage = SKAction.repeatAction(SKAction.sequence([moveLevelImage,replaceLevelImage]), count: 4) 

    var callCount = 2 

    mgImage.runAction(movingAndReplacingLevelImage){() -> Void in 
     if --callCount == 0 { 
      self.midGroundlevelMovingFast() 
     } 
    } 

    mgImage2.runAction(movingAndReplacingLevelImage){() -> Void in 
     if --callCount == 0 { 
      self.midGroundlevelMovingFast() 
     } 
    } 
} 

и, наконец:

func midGroundlevelMovingFast() { 

    let moveLevelImage = SKAction.moveByX(-self.frame.size.width, y: 0, duration: gameSpeed/4) 
    let replaceLevelImage = SKAction.moveByX(self.frame.size.width, y: 0, duration: 0) 
    let movingAndReplacingLevelImage = SKAction.repeatAction(SKAction.sequence([moveLevelImage,replaceLevelImage]), count: 8) 

    mgImage.runAction(movingAndReplacingLevelImage) 
    mgImage2.runAction(movingAndReplacingLevelImage) 
} 

Когда я использую последние два в том же формате, что и раньше, я думаю, что код хорош. Где-то в строке, которую я использую для вызова функции в viewdidload, либо неправильно, либо не может быть сделано так.

Может кто-нибудь объяснить мне, почему это не работает?

Спасибо,

Стивен

Update:

Хорошо, еще раз спасибо за вашу помощь, и я чувствую, что я так близко. Однако я все еще получаю окончательную ошибку, которую я не знаю, как ее решить.

теперь у меня есть:

//Functions for the flow of the level, controlling the speed of the background images and the number of loops each will go through before increasing in speed. 

    func midGroundLevelMovingSlow(completion: (()->Void)?) { 

     let moveLevelImage = SKAction.moveByX(-self.frame.size.width, y: 0, duration: gameSpeed) 
     let replaceLevelImage = SKAction.moveByX(self.frame.size.width, y: 0, duration: 0) 
     let movingAndReplacingLevelImage = SKAction.repeatAction(SKAction.sequence([moveLevelImage,replaceLevelImage]), count: 4) 

     var callCount = 2 

     mgImage.runAction(movingAndReplacingLevelImage){() -> Void in 
      if --callCount == 0 { 
       completion?() 
      } 
     } 

     mgImage2.runAction(movingAndReplacingLevelImage){() -> Void in 
      if --callCount == 0 { 
       completion?() 
      } 
     } 
    } 

Последовал:

func midGroundLevelMovingMedium(completion: (()->Void)?) { 

     let moveLevelImage = SKAction.moveByX(-self.frame.size.width, y: 0, duration: gameSpeed/2) 
     let replaceLevelImage = SKAction.moveByX(self.frame.size.width, y: 0, duration: 0) 
     let movingAndReplacingLevelImage = SKAction.repeatAction(SKAction.sequence([moveLevelImage,replaceLevelImage]), count: 4) 

     var callCount = 2 

     mgImage.runAction(movingAndReplacingLevelImage){() -> Void in 
      if --callCount == 0 { 
       completion?() 
      } 
     } 

     mgImage2.runAction(movingAndReplacingLevelImage){() -> Void in 
      if --callCount == 0 { 
       completion?() 
      } 
     } 
    } 

, а затем:

func midGroundLevelMovingFast(completion: (()->Void)?) { 

     let moveLevelImage = SKAction.moveByX(-self.frame.size.width, y: 0, duration: gameSpeed/4) 
     let replaceLevelImage = SKAction.moveByX(self.frame.size.width, y: 0, duration: 0) 
     let movingAndReplacingLevelImage = SKAction.repeatAction(SKAction.sequence([moveLevelImage,replaceLevelImage]), count: 4) 

     var callCount = 2 

     mgImage.runAction(movingAndReplacingLevelImage){() -> Void in 
      if --callCount == 0 { 
       completion?() 
      } 
     } 

     mgImage2.runAction(movingAndReplacingLevelImage){() -> Void in 
      if --callCount == 0 { 
       completion?() 
      } 
     } 
    } 

Что называется с:

midGroundLevelMovingSlow(completion: { 
     midGroundLevelMovingMedium(completion: { 
      midGroundLevelMovingFast(completion: { 
       print "Finished" 
      }) 
     }) 
    }) 

Который дает мне ошибку на каждой строке «посторонний аргумент« завершение »при вызове«

Кто-нибудь знает, почему это так?

Спасибо,

Стивен

Update:

Это был просто случай удаления посторонних "завершение" слово.

Работы сейчас, блестящие.

ответ

1

В обработчике завершения в runAction вы должны быть вызовом обработчика завершения в методе

mgImage.runAction(movingAndReplacingLevelImage){() -> Void in 
     if --callCount == 0 { 
      completion() 
     } 
    } 

Однако вызов методов, как это все более уродливым, так что я думаю, что это хорошая идея, чтобы изучить, как решить эту проблему с SKAction.sequence и SKAction.group.

https://developer.apple.com/library/ios/documentation/SpriteKit/Reference/SKAction_Ref/#//apple_ref/occ/clm/SKAction/sequence:

https://developer.apple.com/library/ios/documentation/SpriteKit/Reference/SKAction_Ref/#//apple_ref/occ/clm/SKAction/group:

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

т.е.

func midGroundlevelMovingSlow(completion: (()->Void)?) { 

    let moveLevelImage = SKAction.moveByX(-self.frame.size.width, y: 0, duration: gameSpeed) 
    let replaceLevelImage = SKAction.moveByX(self.frame.size.width, y: 0, duration: 0) 
    let movingAndReplacingLevelImage = SKAction.repeatAction(SKAction.sequence([moveLevelImage,replaceLevelImage]), count: 2) 

    var callCount = 2 

    mgImage.runAction(movingAndReplacingLevelImage){() -> Void in 
     if --callCount == 0 { 
      completion() 
     } 
    } 

    mgImage2.runAction(movingAndReplacingLevelImage){() -> Void in 
     if --callCount == 0 { 
      completion() 
     } 
    } 
} 

в вызове

midGroundlevelMovingSlow(completion: { 
    self.foreGroundLevelMovingMedium(completion: { 
     self.foreGroundLevelMovingFast(completion:{}) 
    }) 
}) 
+0

Еще раз спасибо за вашу помощь. Как сказано, я могу заставить его работать для двух функций, как мы обсуждали, и это отлично работает. Когда я добавляю третью функцию, которая вызывается, когда вторая завершена, которая вызывается, когда первая завершена, она падает. – Fiducial13

+1

Поскольку ваш код не вызывает «завершение()», он вызывает фактический метод, который вы должны вместо этого вызывать в блоке, который вы отправляете в качестве параметра для метода. Измените свой код на то, что я написал в ответе. – Moriya

+0

Спасибо. Iv'e использовал это, чтобы переместить вещи вперед и обновить код с тем, что выглядит как окончательная проблема. Стивен – Fiducial13