如何动画一个矩阵一个一个地改变精灵?

How to animate a matrix changing the sprites one by one?

我正在制作一个小游戏,我有一个由 SKSpriteNode 和数字构成的矩阵,当游戏结束时,我正在尝试制作一个动画,如果我遍历矩阵,只一个接一个地改变精灵数字的顺序。看 Board(方块在一个Sknode中,数字在其他Sknode中)

我的想法是将精灵更改为其他颜色,并在更改下一个后等待 2 秒,但我做不到。我不知道如何一个一个地改变精灵。我做了这个函数"RecoverMatrix()",这改变了精灵但是一次全部,就好像没有等待,他改变了所有的精灵并且在等待2秒之前。

func RecoverMatrix() {                         

    var cont = 1
    TileLayer.removeAllChildren()
    numLayer.removeAllChildren()
    let imageEnd = SKAction.setTexture(SKTexture(imageNamed: "rectangle-play"))
    let waiting = SKAction.waitForDuration(2)

    var scene: [SKAction] = []
    var tiles: [SKSpriteNode] = []

    while cont <= 16 {

        for var column = 0; column < 4; column++ {
            for var row = 0; row < 4; row++ {

                if matrix[column][row].number  == cont {

                    let label = SKLabelNode()
                    label.text = "\(matrix[column][row])"
                    label.fontSize = TileHeight - 10
                    label.position = pointForBoard(column, row: row)
                    label.fontColor = UIColor.whiteColor()

                    let tile = SKSpriteNode()
                    tile.size = CGSize(width: TileWidth - 3, height: TileHeight - 3)
                    tile.position = pointForBoard(column, row: row, _a: 0)
                    TileLayer.addChild(tile)
                    numLayer.addChild(label)

                    tiles.append(tile)

                    scene.append(SKAction.sequence([imageEnd, waiting]))

                    tile.runAction(imageEnd)
                    runAction(waiting)
                    didEvaluateActions()
                }
            }
        }
        cont++
    }

    for tile in tiles {
        tile.runAction(SKAction.sequence(scene))
        self.runAction(SKAction.waitForDuration(1))
    }
}

所以,我需要帮助,我找不到制作这个动画的方法。非常感谢您的帮助。谢谢!

您似乎认为 runAction(waiting) 意味着您 code 暂停并等待,在循环之间暂停。它没有(事实上没有办法做到这一点)。您的代码立即循环所有循环,现在KABOOM

因此,所有操作都立即配置并一起执行。

这就是您可以运行 同时对每个节点执行操作的方法(使用循环遍历所有图块):

class GameScene: BaseScene, SKPhysicsContactDelegate {
  var blocks: [[SKSpriteNode]] = []

  override func didMoveToView(view: SKView) {
    makeBoard(4, height: 4)

    colorize()
  }

  func makeBoard(width:Int, height:Int) {
    let distance:CGFloat = 50.0

    var blockID = 1

    //make a width x height matrix of SKSpriteNodes
    for j in 0..<height {
      var row = [SKSpriteNode]()

      for i in 0..<width {
        let node = SKSpriteNode(color: .purpleColor(), size: CGSize(width: 30, height: 30))
        node.name = "\(blockID++)"

        if let nodeName = node.name {node.addChild(getLabel(withText: nodeName))}
        else {
          //handle error
        }

        node.position = CGPoint(x: frame.midX + CGFloat(i) * distance,
          y: frame.midY - CGFloat(j) * distance )

        row.append(node)

        addChild(node)
      }

      blocks.append(row)
    }
  }

  func colorize() {
    let colorize = SKAction.colorizeWithColor(.blackColor(), colorBlendFactor: 0, duration: 0.5)
    var counter = 0.0
    let duration = colorize.duration

    for row in blocks {
      for sprite in row {
        counter++

        let duration = counter * duration
        let wait = SKAction.waitForDuration(duration)

        sprite.runAction(SKAction.sequence([wait, colorize]))
      }
    }
  }

  func getLabel(withText text:String) -> SKLabelNode {
    let label = SKLabelNode(fontNamed: "ArialMT")
    label.fontColor = .whiteColor()
    label.text = text
    label.fontSize = 20
    label.horizontalAlignmentMode = .Center
    label.verticalAlignmentMode = .Center

    return label
  }
}

结果:

所以基本上,正如我在评论中所说,您可以 运行 同时执行所有操作,这就是每个操作开始的时间。