3

我正在使用 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 对象执行。当动作执行时,精灵的 color 和 colorBlendFactor 属性被动画化为它们的新值。

因此,也许有人确实知道为始终更新的 SKLabelNode 着色的好方法?

!!!最后更新!!!

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

再次感谢 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)
    }))
  }
4

1 回答 1

8

您可以通过创建自定义操作来为SKLabelNodean着色。SKAction这是一个如何做到这一点的例子

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);
}))
于 2014-11-18T22:52:37.317 回答