我正在使用 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)
}))
}