SKAction 的行为似乎不像我预期的那样
SKAction doesn't seem to be behaving like I expect
我有一堆动作要一起排序,然后 运行宁 X 次。首先我等待 0.05 秒,然后我播放一个声音文件,然后我在屏幕上添加一个节点并为下一次随机播放声音文件。但是,当我 运行 这样做时,每次迭代播放的声音都是相同的文件。如果迭代部分和向屏幕添加节点有效,为什么声音不会每次都随机化?
var iterator = 0
var sound = "Content/text\(RandomInt(1, max: 5)).m4a"
let waitAction = SKAction.waitForDuration(0.05)
let addNode = SKAction.runBlock({
text.addChild(letterNodes[iterator])
iterator += 1
sound = "Content/text\(RandomInt(1, max: 5)).m4a"
})
let sequenceAction = SKAction.sequence([waitAction, SKAction.playSoundFileNamed(sound, waitForCompletion: false), addNode])
let repeatAction = SKAction.repeatAction(sequenceAction, count: letterNodes.count)
runAction(repeatAction)
我没有完全按照你的代码执行,它也是 Swift 3,但是这个例子接下来是:
它从索引 0 到 2 添加节点,因此首先添加的节点是白色,然后是紫色和棕色。
而且每次声音都会随机化。我想这就是你想要实现的目标。
class GameScene: SKScene {
let letterNodes = [
SKSpriteNode(color: .white, size: CGSize(width: 50, height: 50)),
SKSpriteNode(color: .purple, size: CGSize(width: 50, height: 50)),
SKSpriteNode(color: .brown, size: CGSize(width: 50, height: 50)),
]
var iterator = 0
override func didMove(to view: SKView) {
let wait = SKAction.wait(forDuration: 2.0)
run(SKAction.repeat(SKAction.sequence([wait,SKAction.run(spawn)]), count: letterNodes.count))
}
func spawn(){
let file = "\(GKRandomDistribution.init(lowestValue: 1, highestValue: 5).nextInt()).wav"
let sound = SKAction.playSoundFileNamed(file, waitForCompletion: false)
let addNode = SKAction.run({[unowned self] in
let node = self.letterNodes[self.iterator]
node.position.y = CGFloat(GKRandomDistribution.init(lowestValue: 50, highestValue: 60).nextInt())
self.addChild(node)
self.iterator += 1
})
let sequence = SKAction.sequence([sound,addNode])
self.run(sequence)
}
}
你的代码和我的代码之间的区别在于你只创建了一次声音动作,然后重复使用它。我每次都创造新的声音动作。代码已经过测试并且可以正常工作。您可以轻松地将其转换为您的 Swift 版本并进行试用,因此当您了解其工作原理后,您将能够轻松地根据需要采用它。
我有一堆动作要一起排序,然后 运行宁 X 次。首先我等待 0.05 秒,然后我播放一个声音文件,然后我在屏幕上添加一个节点并为下一次随机播放声音文件。但是,当我 运行 这样做时,每次迭代播放的声音都是相同的文件。如果迭代部分和向屏幕添加节点有效,为什么声音不会每次都随机化?
var iterator = 0
var sound = "Content/text\(RandomInt(1, max: 5)).m4a"
let waitAction = SKAction.waitForDuration(0.05)
let addNode = SKAction.runBlock({
text.addChild(letterNodes[iterator])
iterator += 1
sound = "Content/text\(RandomInt(1, max: 5)).m4a"
})
let sequenceAction = SKAction.sequence([waitAction, SKAction.playSoundFileNamed(sound, waitForCompletion: false), addNode])
let repeatAction = SKAction.repeatAction(sequenceAction, count: letterNodes.count)
runAction(repeatAction)
我没有完全按照你的代码执行,它也是 Swift 3,但是这个例子接下来是:
它从索引 0 到 2 添加节点,因此首先添加的节点是白色,然后是紫色和棕色。
而且每次声音都会随机化。我想这就是你想要实现的目标。
class GameScene: SKScene {
let letterNodes = [
SKSpriteNode(color: .white, size: CGSize(width: 50, height: 50)),
SKSpriteNode(color: .purple, size: CGSize(width: 50, height: 50)),
SKSpriteNode(color: .brown, size: CGSize(width: 50, height: 50)),
]
var iterator = 0
override func didMove(to view: SKView) {
let wait = SKAction.wait(forDuration: 2.0)
run(SKAction.repeat(SKAction.sequence([wait,SKAction.run(spawn)]), count: letterNodes.count))
}
func spawn(){
let file = "\(GKRandomDistribution.init(lowestValue: 1, highestValue: 5).nextInt()).wav"
let sound = SKAction.playSoundFileNamed(file, waitForCompletion: false)
let addNode = SKAction.run({[unowned self] in
let node = self.letterNodes[self.iterator]
node.position.y = CGFloat(GKRandomDistribution.init(lowestValue: 50, highestValue: 60).nextInt())
self.addChild(node)
self.iterator += 1
})
let sequence = SKAction.sequence([sound,addNode])
self.run(sequence)
}
}
你的代码和我的代码之间的区别在于你只创建了一次声音动作,然后重复使用它。我每次都创造新的声音动作。代码已经过测试并且可以正常工作。您可以轻松地将其转换为您的 Swift 版本并进行试用,因此当您了解其工作原理后,您将能够轻松地根据需要采用它。