从对象创建循环转换为在对象创建之间等待的 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. 第一个添加的动作确实包含创建第一个箭头的代码
  2. 然后有个动作等待1秒
  3. 然后添加第二个箭头的动作
  4. 等等...

for loop结束后,动作列表变成sequence并最终执行。

让我知道它是否有效。