【问题标题】:How to run an actions on collection of sprites?如何对精灵集合运行动作?
【发布时间】:2019-05-08 01:40:20
【问题描述】:

我尝试在精灵数组上运行一些动作,并且需要为精灵按顺序运行这些动作,问题是当我使用 for 循环时它立即应用动作并且它们之间没有时间段.

func setColors() {
    for color in boyColors {
        color.run(.wait(forDuration: 0.3))
        color.run(.fadeIn(withDuration: 0.5))
    }
}

当调用这个函数时,它应该淡出颜色 的 boyColors 数组,它们之间有一段时间,但它在所有颜色中褪色一次

【问题讨论】:

    标签: swift sprite-kit


    【解决方案1】:

    如果您希望所有 4 个在延迟后同时淡入:

    func setColors() {
       let seq = [SKAction.wait(forDuration: 0.3),SKAction.fadeIn(withDuration: 0.5)]
        for color in boyColors {
    
            color.run(SKAction.sequence(seq))
        }
    }
    

    如果您需要它们按顺序淡入:

    func setColors() {
        var seq = [SKAction]()
        let wait3 = SKAction.wait(forDuration: 0.3)
        let wait5 = SKAction.wait(forDuration: 0.5)
        let fadeIn = SKAction.fadeIn(withDuration: 0.5)
    
        for color in boyColors {
            let colorFadeIn = SKAction.run({color?.run(fadeIn)})
            let group = [wait5,colorFadeIn]
            seq.append(wait3)
            seq.append(SKAction.group(group))
        }
        scene.run(SKAction.sequence(seq))
    }
    

    这样做是允许您的场景(或您想要触发动作的任何节点)控制淡入淡出事件何时开始。这假设所有节点都以相同的速度运行。如果您需要节点以单独的速度运行,您将需要更复杂的东西,例如 SomaMen 提出的将您的下一个颜色操作链接到当前颜色的末尾。您还必须检查在这方面是否存在颜色,因为如果您使用 RGBY 之类的链,然后删除 G,则唯一会触发的颜色是 R。

    【讨论】:

      【解决方案2】:

      您可以使用多种 SKAction,包括可以使用的完成运行。一种可能的方法是 -

      var colors = boyColors // so we can remove each item as we've faded it in
      var waitAndFadeIn: (() -> ())?
      
      waitAndFadeIn = {
          guard let boyColor = colors.first else { return } // stops when we run out of items
      
          let wait: SKAction = .wait(forDuration: 0.3)
          let fadeIn: SKAction = .fadeIn(withDuration: 0.5)
      
          let sequence: SKAction = .sequence([wait, fadeIn])
      
          boyColor.run(sequence, completion: {
              colors.remove(at: 0)
              waitAndFadeIn?() // do it again with the next boyColor 
          })
      }
      
      waitAndFadeIn?()
      

      这会在对象中一个接一个地消失。我认为代码会运行,但这是我无法测试的粗略的东西。

      【讨论】:

      • 将所有动作链接到 1 个序列中,而不是使用完成。完成处理程序有一个错误,它可能会触发两次,具体取决于您对节点的操作(例如移动到新的父节点)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-26
      • 2011-06-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多