我有一个运行10次的for循环,每次创建一个节点并将其添加到场景中。但是,我希望在添加每个节点之间有一个延迟(添加节点,等待一秒,添加节点,等待一秒等)。
然而,在前1秒后,所有10个节点同时被添加。如何在添加的每个节点之间实现等待一秒的预期效果?
这是我的代码:
编辑:
func createText(correct: Bool) {
let text = SKNode()
var line: String!
addChild(text)
if correct {
line = (GKRandomSource.sharedRandom().arrayByShufflingObjectsInArray(happyLines) as! [String])[0]
} else {
line = (GKRandomSource.sharedRandom().arrayByShufflingObjectsInArray(sadLines) as! [String])[0]
}
var xPos = self.frame.midX + 300
var yPos = self.frame.midY
var spaces = 1
// For each character in sentence, create a node of it
for character in line.characters {
runAction(SKAction.waitForDuration(1.0)) {
if spaces == 4 {
spaces = 0
print("space")
xPos = self.frame.midX + 300
yPos -= 30
}
xPos += 10
if character != " " {
let letter = SKLabelNode(fontNamed: GameScene.fontName)
letter.fontSize = 14 * GameScene.fontScale
letter.position = CGPoint(x: xPos, y: yPos)
letter.text = String(character)
text.addChild(letter)
} else {
spaces += 1
xPos += 10
}
}
}
runAction(SKAction.waitForDuration(2.0)) {
text.removeAllChildren()
text.removeFromParent()
}
}
答案 0 :(得分:1)
您可以使用操作来实现此目的。
首先,为延迟创建操作并将节点添加到场景中。
let waitAction = SKAction.wait(forDuration: 1)
let addNodeAction = SKAction.run {
let node = SKSpriteNode(imageNamed: "example")
self.addChild(node)
}
接下来,创建一系列操作,以便在将节点添加到场景之前始终发生延迟。
let sequenceAction = SKAction.sequence([waitAction, addNodeAction])
接下来,创建一个重复序列10次的动作。
let repeatAction = SKAction.repeat(sequenceAction, count: 10)
最后,运行此操作并观察节点!
run(repeatAction)
编辑:
要在关于需要访问当前字符的注释中解决第二个问题(使每个操作添加的节点略有不同),循环遍历characters
以构建一系列操作,然后运行该问题动作。
var actions = [SKAction]()
let waitAction = SKAction.wait(forDuration: 1)
for character in line.characters {
let addNodeAction = SKAction.run {
let node = SKSpriteNode(imageNamed: "example")
// use the character variable here
self.addChild(node)
}
actions.append(waitAction)
actions.append(addNodeAction)
}
let sequenceAction = SKAction.sequence(actions)
run(sequenceAction)
答案 1 :(得分:0)
这个怎么样? (未经测试:)
for (i, character) in line.characters.enumerate() {
runAction(SKAction.waitForDuration(Double(i) * 1.0)) {
// rest of your for loop
所以你通过字符枚举,其中i是第i个字符,从0开始。对于每个字符,你只需将字符串中的索引位置与1秒间隔相乘,即可得到等待时间。