我尝试在子画面数组上运行一些动作,并且需要为子画面依次运行此动作,问题是当我使用for循环时,它立即应用该动作,并且它们之间没有时间间隔
func setColors() {
for color in boyColors {
color.run(.wait(forDuration: 0.3))
color.run(.fadeIn(withDuration: 0.5))
}
}
调用此函数时,它应淡入颜色 的boyColors数组之间有一定的时间间隔,但是它在所有颜色中的消失一次就吃掉了
答案 0 :(得分:1)
如果您希望所有4个在延迟后同时消失:
func setColors() {
let seq = [SKAction.wait(forDuration: 0.3),SKAction.fadeIn(withDuration: 0.5)]
for color in boyColors {
color.run(SKAction.sequence(seq))
}
}
如果您需要它们逐渐淡入淡出:
func setColors() {
var seq = [SKAction]()
let wait3 = SKAction.wait(forDuration: 0.3)
let wait5 = SKAction.wait(forDuration: 0.5)
let fadeIn = SKAction.fadeIn(withDuration: 0.5)
for color in boyColors {
let colorFadeIn = SKAction.run({color?.run(fadeIn)})
let group = [wait5,colorFadeIn]
seq.append(wait3)
seq.append(SKAction.group(group))
}
scene.run(SKAction.sequence(seq))
}
这是为了允许场景(或要触发动作的任何节点)控制淡入淡出事件的开始时间。这假定所有节点都以相同的速度运行。如果您需要节点以单独的速度运行,则需要更复杂的东西,例如SomaMen建议将下一个颜色动作链接到当前颜色的末尾。您还必须检查这方面的颜色是否存在,因为如果您使用RGBY之类的链,并且删除了G,则唯一会发射的颜色是R。
答案 1 :(得分:0)
您可以使用各种SKAction,包括带有完成功能的运行。一种可能的方法是-
var colors = boyColors // so we can remove each item as we've faded it in
var waitAndFadeIn: (() -> ())?
waitAndFadeIn = {
guard let boyColor = colors.first else { return } // stops when we run out of items
let wait: SKAction = .wait(forDuration: 0.3)
let fadeIn: SKAction = .fadeIn(withDuration: 0.5)
let sequence: SKAction = .sequence([wait, fadeIn])
boyColor.run(sequence, completion: {
colors.remove(at: 0)
waitAndFadeIn?() // do it again with the next boyColor
})
}
waitAndFadeIn?()
这会在对象中逐渐消失。我认为代码可以运行,但这是我无法测试的东西。