Swift 交换两个SKSPRITENODE的位置并等待完成

Swift 交换两个SKSPRITENODE的位置并等待完成,swift,sprite-kit,Swift,Sprite Kit,我有一个函数,它应该用SKAction.move交换两个SKSpriteNodes(Card是一个子类)的位置: func animateSwapCard(card1 :Card, card2: Card, duration:TimeInterval) { let inital = card1.position card1.run(SKAction.move(to: card2.position, duration: duration)) card2.run(SKActi

我有一个函数,它应该用SKAction.move交换两个SKSpriteNodes(Card是一个子类)的位置:

func animateSwapCard(card1 :Card, card2: Card, duration:TimeInterval) {
    let inital = card1.position
    card1.run(SKAction.move(to: card2.position, duration: duration))
    card2.run(SKAction.move(to: inital, duration: duration))
}
两个SKActions应同时运行,但animateSwapCard()应在两个SKActions完成后返回。我试图创建一个同时包含actions和SKAction.wait的SKAction.sequence,但没有成功

该函数在其他函数中被多次调用:

override func viewDidLoad() {
    placeCards()
    // get refrences to cardA and cardB
    animateSwapCard(card1: cardA, card2: cardB, duration: 1)
    // get refrence to cardC
    animateSwapCard(card1: cardB, card2: cardC, duration: 1)
    // get refrences to card D and cardE
    animateSwapCard(card1: cardD, card2: cardE, duration: 1)
}
发生的情况是,对animateSwapCard()的第二次和第三次调用在第一次调用之后立即启动。它不会等到动物完成后再去下一个。所有的牌都在同一时间开始移动


我想存档的是cardA和cardB的位置变化。动画完成后,cardB和cardC将更改位置。之后,cardD和cardE也应该这样做。

有几种方法可以做到这一点

问题是所有动作都是同时触发的。代码不知道您希望操作之间有延迟,因为您没有告诉它延迟

下面是最简单的解决方案,可以帮助您了解发生了什么问题

override func viewDidLoad() {

    placeCards()

    var wait = SKAction.wait(forDuration: 1)

    // get refrences to cardA and cardB
    animateSwapCard(card1: cardA, card2: cardB, duration: 1)

    // get refrence to cardC
    self.run(wait) {
         animateSwapCard(card1: cardB, card2: cardC, duration: 1)
    }

    wait = SKAction.wait(forDuration: 2)
    // get refrences to card D and cardE
    self.run(wait) {
        animateSwapCard(card1: cardD, card2: cardE, duration: 1)
    }
}

func animateSwapCard(card1: Card, card2: Card, duration: TimeInterval) {
    let inital = card1.position
    card1.run(SKAction.move(to: card2.position, duration: duration))
    card2.run(SKAction.move(to: inital, duration: duration))
}
尽管这种方法很难看,而且如果你想做两次以上的掉期交易,那就成了麻烦事

您可以在函数上使用完成闭包

func animateSwapCard(card1: Card, card2: Card, duration: TimeInterval, complete: () -> ()) {
    let inital = card1.position
    card1.run(SKAction.move(to: card2.position, duration: duration))
    card2.run(SKAction.move(to: inital, duration: duration)) {
        complete()
    }
}
像这样使用它

override func viewDidLoad() {

    placeCards()

    // get refrences to cardA and cardB
    animateSwapCard(card1: cardA, card2: cardB, duration: 1) {

        // get refrence to cardC
        animateSwapCard(card1: cardB, card2: cardC, duration: 1) {

            // get refrences to card D and cardE
            animateSwapCard(card1: cardD, card2: cardE, duration: 1) { }
        }
    }
}

有几种方法可以做到这一点

问题是所有动作都是同时触发的。代码不知道您希望操作之间有延迟,因为您没有告诉它延迟

下面是最简单的解决方案,可以帮助您了解发生了什么问题

override func viewDidLoad() {

    placeCards()

    var wait = SKAction.wait(forDuration: 1)

    // get refrences to cardA and cardB
    animateSwapCard(card1: cardA, card2: cardB, duration: 1)

    // get refrence to cardC
    self.run(wait) {
         animateSwapCard(card1: cardB, card2: cardC, duration: 1)
    }

    wait = SKAction.wait(forDuration: 2)
    // get refrences to card D and cardE
    self.run(wait) {
        animateSwapCard(card1: cardD, card2: cardE, duration: 1)
    }
}

func animateSwapCard(card1: Card, card2: Card, duration: TimeInterval) {
    let inital = card1.position
    card1.run(SKAction.move(to: card2.position, duration: duration))
    card2.run(SKAction.move(to: inital, duration: duration))
}
尽管这种方法很难看,而且如果你想做两次以上的掉期交易,那就成了麻烦事

您可以在函数上使用完成闭包

func animateSwapCard(card1: Card, card2: Card, duration: TimeInterval, complete: () -> ()) {
    let inital = card1.position
    card1.run(SKAction.move(to: card2.position, duration: duration))
    card2.run(SKAction.move(to: inital, duration: duration)) {
        complete()
    }
}
像这样使用它

override func viewDidLoad() {

    placeCards()

    // get refrences to cardA and cardB
    animateSwapCard(card1: cardA, card2: cardB, duration: 1) {

        // get refrence to cardC
        animateSwapCard(card1: cardB, card2: cardC, duration: 1) {

            // get refrences to card D and cardE
            animateSwapCard(card1: cardD, card2: cardE, duration: 1) { }
        }
    }
}

它不起作用,描述不够。什么不起作用?它做什么?你是对的,我会用更好的解释编辑原始帖子。它不起作用,描述不够。什么不起作用?这是做什么的?你是对的,我会用一个更好的解释来编辑原始帖子。这很有效,非常感谢。虽然它不是很优雅,但是如果苹果没有在SKActions上提供一个简单的.wait()方法,你能做什么呢?这很好,非常感谢。虽然它不是很优雅,但是如果苹果没有在SKActions上提供一个简单的.wait()方法,你能做什么呢。。。