Я пытаюсь получить три функции для вызова, один за другим после каждого завершения определенного числа циклов.Как выполнять последовательные вызовы функций с помощью обработчика завершения в 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:
Это был просто случай удаления посторонних "завершение" слово.
Работы сейчас, блестящие.
Еще раз спасибо за вашу помощь. Как сказано, я могу заставить его работать для двух функций, как мы обсуждали, и это отлично работает. Когда я добавляю третью функцию, которая вызывается, когда вторая завершена, которая вызывается, когда первая завершена, она падает. – Fiducial13
Поскольку ваш код не вызывает «завершение()», он вызывает фактический метод, который вы должны вместо этого вызывать в блоке, который вы отправляете в качестве параметра для метода. Измените свой код на то, что я написал в ответе. – Moriya
Спасибо. Iv'e использовал это, чтобы переместить вещи вперед и обновить код с тем, что выглядит как окончательная проблема. Стивен – Fiducial13