交换两个 SKSpriteNode 的位置并等待完成
Swap positions of two SKSpriteNodes and wait for completion
我有一个函数应该交换两个 SKSpriteNodes(Card 是一个子类)的位置 SKAction.move:
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() 应该 return 在两个 SKActions 完全完成之后。我试图创建一个 SKAction.sequence 和一个 SKAction.wait,但它没有用。
该函数在另一个函数中被多次调用:
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) { }
}
}
}
我有一个函数应该交换两个 SKSpriteNodes(Card 是一个子类)的位置 SKAction.move:
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() 应该 return 在两个 SKActions 完全完成之后。我试图创建一个 SKAction.sequence 和一个 SKAction.wait,但它没有用。
该函数在另一个函数中被多次调用:
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) { }
}
}
}