SKAction.colorizeWithColor使SKLabelNode消失

时间:2014-11-18 21:50:24

标签: ios swift sprite-kit skaction sklabelnode

我正在使用SKLabelNode。我正在创建它并将它作为一个孩子添加到我的场景中它显示没有问题,但当我尝试使用colorizeWithColor()方法更改它的颜色(而不是fontColor)时,标签淡出。

以下是问题所在:

myLabel.runAction(SKAction.colorizeWithColor(SKColor.blueColor(), colorBlendFactor: 1.0, duration: duration))

在完成此操作后,我在控制台上打印了myLabel.color属性,这是我得到的:

Optional(UIDeviceRGBColorSpace 0.99178 0.99178 1 0.00822043)

正如你所看到的,alpha值几乎为0,所以我猜这就是标签消失的原因,但我不明白为什么会这样。

提前致谢。

更新: 好的,所以我发现了这个并且我的不好,我在询问之前没有搜索过。以下是有关colorizeWithColor方法的文档:

  

此操作只能由SKSpriteNode对象执行。当。。。的时候   动作执行,精灵的颜色和colorBlendFactor属性   动画到他们的新价值。

所以也许有人确实知道要为总是更新的SKLabelNode着色的好方法吗?

!!!最后更新!!!

我能够找到一个解决方案,但0x141E提出了一个更好的解决方案,我使用并创建了下一个方法,当你需要从颜色A转换到颜色B时,这个方法很有效。 0x141E你曾经回到过fontColor,它会在你改变颜色时闪烁。在我的情况下,它改变了fontColor,而不是color属性,这导致了一个非常好的过渡(当然不是很好)。

再次感谢0x141E这个非常好的方法!!!

这是我的解决方案:

当您调用参数withDuration = 0.5的方法时,此特殊情况非常有效 但是,如果您需要其他时间,可以使用发送的withDuration参数或乘数,在我的代码中为5。 即使在那当然应该是一个更好的解决方案,所以如果你发现请分享它。根据我的需要,这个很棒。

首先是视频,以便了解它的工作原理:https://www.youtube.com/watch?v=ZIz8Bn0-hUA&feature=youtu.be

  func changeColorForLabelNode(labelNode: SKLabelNode, toColor: SKColor, withDuration: NSTimeInterval) {
    labelNode.runAction(SKAction.customActionWithDuration(withDuration, actionBlock: {
      node, elapsedTime in

      let label = node as SKLabelNode

      let toColorComponents = CGColorGetComponents(toColor.CGColor)
      let fromColorComponents = CGColorGetComponents(label.fontColor.CGColor)

      let finalRed = fromColorComponents[0] + (toColorComponents[0] - fromColorComponents[0])*CGFloat(elapsedTime / (CGFloat(withDuration)*5))
      let finalGreen = fromColorComponents[1] + (toColorComponents[1] - fromColorComponents[1])*CGFloat(elapsedTime / (CGFloat(withDuration)*5))
      let finalBlue = fromColorComponents[2] + (toColorComponents[2] - fromColorComponents[2])*CGFloat(elapsedTime / (CGFloat(withDuration)*5))
      let finalAlpha = fromColorComponents[3] + (toColorComponents[3] - fromColorComponents[3])*CGFloat(elapsedTime / (CGFloat(withDuration)*5))

      labelNode.fontColor = SKColor(red: finalRed, green: finalGreen, blue: finalBlue, alpha: finalAlpha)
    }))
  }

1 个答案:

答案 0 :(得分:6)

您可以通过创建自定义操作,使SKLabelNodeSKAction着色。这是一个如何做到这一点的例子

myLabel.color = SKColor.blueColor()
myLabel.colorBlendFactor = 0.0

let duration:NSTimeInterval = 2.0
myLabel.runAction(SKAction.customActionWithDuration(duration, actionBlock: {
    node, elapsedTime in

    let label = node as SKLabelNode
    label.colorBlendFactor = elapsedTime / CGFloat(duration);
}))