在 for 循环中等待 SKAction 完成
Waiting for SKAction completion inside a for loop
我有一个运行 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()
}
}
您可以使用操作来实现。
首先,为延迟创建动作并将节点添加到场景中。
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)
这个怎么样? (未测试:)
for (i, character) in line.characters.enumerate() {
runAction(SKAction.waitForDuration(Double(i) * 1.0)) {
// rest of your for loop
所以你枚举字符,其中 i 是 i-th 字符,从 0 开始。对于每个字符,你只需将其在字符串中的索引位置乘以 1 秒间隔即可等待持续时间。
我有一个运行 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()
}
}
您可以使用操作来实现。
首先,为延迟创建动作并将节点添加到场景中。
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)
这个怎么样? (未测试:)
for (i, character) in line.characters.enumerate() {
runAction(SKAction.waitForDuration(Double(i) * 1.0)) {
// rest of your for loop
所以你枚举字符,其中 i 是 i-th 字符,从 0 开始。对于每个字符,你只需将其在字符串中的索引位置乘以 1 秒间隔即可等待持续时间。