从对象创建循环转换为在对象创建之间等待的 runBlock
Converting from an object-creating loop to a runBlock with a wait between object creation
抱歉,swift 很新,而且编码一般,所以这可能是一个初学者问题。我目前有下面的代码围绕一个圆圈创建箭头。我如何转换它以便所有箭头都在最后一个箭头后 1 秒生成,直到它们全部创建?另一个线程中的用户告诉我,这必须使用 runBlock 和 SKAction.sequence 来完成,但我对它们几乎不熟悉。我能得到一些帮助吗?谢谢! (:
override func didMoveToView(view: SKView) {
self.spawnArrows()
}
func spawnArrows() {
for var i = 0; i < 36; i++ {
let arrow = self.createArrow(specificPointOnCircle(Float(self.frame.size.width), center: CGPoint(x: CGRectGetMidX(self.frame), y: CGRectGetMidY(self.frame)), angle: Float(i * 10)))
self.addChild(arrow)
}
}
func specificPointOnCircle(radius:Float, center:CGPoint, angle:Float) -> CGPoint {
let theta = angle * Float(M_PI) / 180
let x = radius * cosf(theta)
let y = radius * sinf(theta)
return CGPoint(x: CGFloat(x) + center.x, y: CGFloat(y) + center.y)
}
func createArrow(position: CGPoint) -> SKSpriteNode {
let arrow = SKSpriteNode(imageNamed: "Arrow.png")
arrow.zPosition = 2
arrow.size = CGSize(width: self.frame.size.width / 2 * 0.12, height: self.frame.size.width * 0.025)
arrow.position = position
return arrow
}
您可以像下面这样更新您的 spawnArrows
方法
func spawnArrows() {
var list = [SKAction]()
for var i = 0; i < 36; i++ {
let create = SKAction.runBlock { [unowned self] in
let arrow = self.createArrow(self.specificPointOnCircle(Float(self.frame.size.width), center: CGPoint(x: CGRectGetMidX(self.frame), y: CGRectGetMidY(self.frame)), angle: Float(i * 10)))
self.addChild(arrow)
}
list.append(create)
let wait = SKAction.waitForDuration(1)
list.append(wait)
}
let sequence = SKAction.sequence(list)
self.runAction(sequence)
}
如您现在所见,我正在使用 for loop
创建一个 操作列表。
- 第一个添加的动作确实包含创建第一个箭头的代码
- 然后有个动作等待1秒
- 然后添加第二个箭头的动作
- 等等...
for loop
结束后,动作列表变成sequence
并最终执行。
让我知道它是否有效。
抱歉,swift 很新,而且编码一般,所以这可能是一个初学者问题。我目前有下面的代码围绕一个圆圈创建箭头。我如何转换它以便所有箭头都在最后一个箭头后 1 秒生成,直到它们全部创建?另一个线程中的用户告诉我,这必须使用 runBlock 和 SKAction.sequence 来完成,但我对它们几乎不熟悉。我能得到一些帮助吗?谢谢! (:
override func didMoveToView(view: SKView) {
self.spawnArrows()
}
func spawnArrows() {
for var i = 0; i < 36; i++ {
let arrow = self.createArrow(specificPointOnCircle(Float(self.frame.size.width), center: CGPoint(x: CGRectGetMidX(self.frame), y: CGRectGetMidY(self.frame)), angle: Float(i * 10)))
self.addChild(arrow)
}
}
func specificPointOnCircle(radius:Float, center:CGPoint, angle:Float) -> CGPoint {
let theta = angle * Float(M_PI) / 180
let x = radius * cosf(theta)
let y = radius * sinf(theta)
return CGPoint(x: CGFloat(x) + center.x, y: CGFloat(y) + center.y)
}
func createArrow(position: CGPoint) -> SKSpriteNode {
let arrow = SKSpriteNode(imageNamed: "Arrow.png")
arrow.zPosition = 2
arrow.size = CGSize(width: self.frame.size.width / 2 * 0.12, height: self.frame.size.width * 0.025)
arrow.position = position
return arrow
}
您可以像下面这样更新您的 spawnArrows
方法
func spawnArrows() {
var list = [SKAction]()
for var i = 0; i < 36; i++ {
let create = SKAction.runBlock { [unowned self] in
let arrow = self.createArrow(self.specificPointOnCircle(Float(self.frame.size.width), center: CGPoint(x: CGRectGetMidX(self.frame), y: CGRectGetMidY(self.frame)), angle: Float(i * 10)))
self.addChild(arrow)
}
list.append(create)
let wait = SKAction.waitForDuration(1)
list.append(wait)
}
let sequence = SKAction.sequence(list)
self.runAction(sequence)
}
如您现在所见,我正在使用 for loop
创建一个 操作列表。
- 第一个添加的动作确实包含创建第一个箭头的代码
- 然后有个动作等待1秒
- 然后添加第二个箭头的动作
- 等等...
for loop
结束后,动作列表变成sequence
并最终执行。
让我知道它是否有效。