SKAction.colorizeWithColor makes SKLabelNode disappear

眉间皱痕 提交于 2019-12-07 22:51:31

问题


I'm using SKLabelNode. I'm creating it and add it to my scene as a child and it displays with no problem, but when I try to change it's color (not fontColor) with the colorizeWithColor() method the label fades out.

Here is the line with the problem:

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

I printed to the console the myLabel.color property after the completion of this action and here is what I get:

Optional(UIDeviceRGBColorSpace 0.99178 0.99178 1 0.00822043)

As you can see, the alpha value is almost 0, so I guess this is why the label disappears, but I don't understand why this is happening.

Thanks in advance.

UPDATE: Ok, so I found actually this and is my bad that I didn't searched before asking. Here is the documentation about colorizeWithColor method:

This action can only be executed by an SKSpriteNode object. When the action executes, the sprite’s color and colorBlendFactor properties are animated to their new values.

So maybe anybody does know a good work around for colorize a SKLabelNode that is always updating?

!!!LAST UPDATE!!!

I was able to find a solution, but 0x141E came up with a even more nice solution, which I used and created the next method that works nice when you need to make transition from color A to color B. In solution suggested by 0x141E you ever come back to fontColor and it causes to blink when you change color. In my case it changes the fontColor, not the color property, which causes a pretty nice transition (Of course not great).

Thanks again 0x141E for the really nice approach!!!

Here is my solution:

This particular case works great when you call the method for parameter withDuration = 0.5 However if you need other time, you can play around with the sent withDuration parameter or the multiplier, that in my code is 5. Even there of course should be a better solution so if you find please share it. For my needs this one works fantastic.

First of all a video so you can see how it works: 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:


You can colorize an SKLabelNode with an SKAction by creating a custom action. Here's an example of how to do that

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);
}))


来源:https://stackoverflow.com/questions/27004758/skaction-colorizewithcolor-makes-sklabelnode-disappear

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!