如何使用 Swift SpriteKit 在 For 循环中一一创建 SKSprite 节点
Posted
技术标签:
【中文标题】如何使用 Swift SpriteKit 在 For 循环中一一创建 SKSprite 节点【英文标题】:How to create SKSprite node one by one in For loop using Swift SpriteKit 【发布时间】:2018-06-08 15:24:07 【问题描述】:我想通过 For 循环创建 10 个 SKSPrite 节点。我希望节点一个接一个出现,但使用我的代码,所有 10 个节点同时出现。增加等待时间并没有帮助。提前谢谢你。
for i in 1 ... 10
self.stone[i - 1].position = CGPoint(x: 0 , y: -100)
self.stone[i - 1].anchorPoint = CGPoint(x: 0.5, y: 0.5)
self.stone[i - 1].size = CGSize(width: 50, height: 50)
self.stone[i - 1].physicsBody = SKPhysicsBody(circleOfRadius: 20)
self.stone[i - 1].physicsBody!.affectedByGravity = false
self.stone[i - 1].physicsBody!.categoryBitMask = PhysicsCategory.Object1
self.stone[i - 1].zPosition = 2
self.addChild(self.stone[i - 1])
let actionMove = SKAction.move(to: CGPoint(x: 0, y: 0), duration: 0.3)
let actionRolling = SKAction.animate(with: stone[i - 1].arrayTexture, timePerFrame: 0.05)
let actionDelay = SKAction.wait(forDuration: 1.0)
let actionSequence = SKAction.sequence([actionMove,actionRolling,actionDelay])
stone[i - 1].run(actionSequence)
【问题讨论】:
【参考方案1】:您在代码中所做的所有事情都是创建一个创建节点的循环,您在该循环中应用于这些节点的任何持续时间都将平等地影响它们。您需要一个在循环之外的变量,该变量在每个节点实例的循环中递增。
var delay: Double = 1.0
for i in 1 ... 10
self.run(.wait(forDuration: delay)
self.stone[i - 1].position = CGPoint(x: 0 , y: -100)
self.stone[i - 1].anchorPoint = CGPoint(x: 0.5, y: 0.5)
self.stone[i - 1].size = CGSize(width: 50, height: 50)
self.stone[i - 1].physicsBody = SKPhysicsBody(circleOfRadius: 20)
self.stone[i - 1].physicsBody!.affectedByGravity = false
self.stone[i - 1].physicsBody!.categoryBitMask = PhysicsCategory.Object1
self.stone[i - 1].zPosition = 2
self.addChild(self.stone[i - 1])
let actionMove = SKAction.move(to: CGPoint(x: 0, y: 0), duration: 0.3)
let actionRolling = SKAction.animate(with: stone[i - 1].arrayTexture, timePerFrame: 0.05)
let actionDelay = SKAction.wait(forDuration: 1.0)
let actionSequence = SKAction.sequence([actionMove,actionRolling,actionDelay])
stone[i - 1].run(actionSequence)
delay += 1.0
【讨论】:
您好,您的解决方案有效。谢谢你。但是,我不知道它是如何以及为什么起作用的!我不明白这里有2点:1)“self.run(.wait(forDuration:delay)”是做什么的?它是怎么做的?不知道你在run函数之后添加了大括号。 2) delay +=1 为什么每次迭代都必须增加延迟?这是否意味着在 9 和 10 次迭代之间,延迟为 10?我运行程序时似乎没有。我在哪里可以阅读更多关于此的信息?再次感谢您。 末尾的 与输入 run(action: SKAction, completion: () -> Void) 相同。这只是意味着在操作运行后执行此 代码块 至于时间延迟...想象一下,在您的循环中只是语句 print(1 + 1) 并且它通过循环 4 次。你会看到 2 被打印到控制台 4 次而不是 2、4、6、8。这与你的 actionDelay 没有什么不同,你没有将它添加到任何东西,所以你实际上得到了 10 个 actionDelay,时间为 1.0,电话是能够几乎瞬间处理所有这十个语句,使其看起来好像都在发生。您在第 10 次迭代时是正确的,延迟为 10 我现在明白了 run(action: SKAction) 与 run(action: SKAction, completion: () -> Void) 是一样的。 中的代码是完成处理程序代码。谢谢。 对于延迟+=1.0,我还是不太明白。迭代 1 的延迟为 1,迭代 2 的延迟变为 2,迭代 10 的延迟为 10。因此,所有迭代的总延迟为 1+2+3+..+10。这意味着每次迭代的延迟会越来越长。但是,当我运行程序时,每次迭代的延迟似乎几乎相同(这正是我想要的)。请帮助新手理解这一点。谢谢。以上是关于如何使用 Swift SpriteKit 在 For 循环中一一创建 SKSprite 节点的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Swift 在 SpriteKit 上绘制贝塞尔曲线?
如何使用 Swift 正确切换 SpriteKit 中的 SKScene?
如何使用 Swift 在 SpriteKit 程序中初始化/移动相机?
如何使用 swift 使用带有 spriteKit 的情节提要