【问题标题】:colorizeWithColor and SKLabelNodecolorizeWithColor 和 SKLabelNode
【发布时间】:2013-11-01 01:17:19
【问题描述】:

SKAction colorizeWithColor: 根据文档仅适用于SKSpriteNode,那么我们如何处理SKLabelNode? SKLabelNode 确实 具有可以静态设置的colorcolorBlendFactor 属性。有什么方法可以用 SKAction 制作动画吗?

我目前的方法是使用 SKView 的实例方法 textureFromNode 将 SKLabelNode 渲染到纹理,但只需从该 atm 中获取 nil 纹理:-(

更新:你知道什么。我想我发现了纹理渲染的问题。在 SKScene 的 init 方法中无法对纹理进行红化,因为此时 self.view 为零。所以我在 didMoveToView 中尝试了它,瞧,纹理渲染。无论如何谢谢:-)

【问题讨论】:

    标签: sprite-kit sklabelnode


    【解决方案1】:

    也许有人会觉得这很有用。

       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))
          let finalGreen = fromColorComponents[1] + (toColorComponents[1] - fromColorComponents[1])*CGFloat(elapsedTime / CGFloat(withDuration))
          let finalBlue = fromColorComponents[2] + (toColorComponents[2] - fromColorComponents[2])*CGFloat(elapsedTime / CGFloat(withDuration))
          let finalAlpha = fromColorComponents[3] + (toColorComponents[3] - fromColorComponents[3])*CGFloat(elapsedTime / CGFloat(withDuration))
    
          labelNode.fontColor = SKColor(red: finalRed, green: finalGreen, blue: finalBlue, alpha: finalAlpha)
        }))
      }
    

    您甚至可以在此演示中查看此函数的使用结果:https://www.youtube.com/watch?v=ZIz8Bn0-hUA&feature=youtu.be

    我决定在这里写一个简短的不错的解决方案,但是如果您需要更多详细信息,请查看以下问题:SKAction.colorizeWithColor makes SKLabelNode disappear

    【讨论】:

    • 很高兴您发现它很有用。其实我找到了更好的解决方案。当标签更改时,我正在创建 SKTexture,然后从该纹理创建一个精灵节点,这允许我在这个带有文本的新精灵节点上使用 colorizeWithColor 操作。我正在显示 spritenode 而不是 labelnode。这种方法占用的cpu更少。
    【解决方案2】:

    SKLabelNode 还有一个可以设置的 fontColor 属性。但是,它不响应 colorizeWithColor 方法。

    但是,您仍然可以通过将文本与另一种 SKSpriteNode 颜色同步来动态更改文本的颜色。如果你在你的精灵上调用 colorizeWithColor,字体颜色会随之改变。这包括在指定持续时间内的颜色过渡。示例:

        [_tileCountLabel runAction:[SKAction repeatActionForever:
                                [SKAction customActionWithDuration:COLOR_TRANSITION_SPEED actionBlock:^(SKNode *node, CGFloat elapsedTime) {
        _tileCountLabel.fontColor = _tileLayer0.color;
    }]]];
    

    另外,我尝试使用 SKCropNode 掩码尝试通过父 SKSpriteNode 设置字体颜色。 SKSpriteNode 上的 colorizeWithColor 方法有效,但字体严重损坏且粗大。所以,没用。

    【讨论】:

      【解决方案3】:

      所以这里是 SKTexture/SKSpriteNode 解决方案。为了便于使用,它可能被包装在自己的类中。要记住的一件事是在 self.view 不为零的地方渲染它......

      SKLabelNode *labNode = [SKLabelNode labelNodeWithFontNamed:FONT_GAME];
      labNode.fontSize = 30.0f;
      labNode.fontColor = [SKColor whiteColor];
      labNode.text = @"TEST";
      
      SKTexture *texture;
      
      NSAssert(self.view != nil, @"Can't access self.view so sorry.");
      texture = [self.view textureFromNode:labNode];
      DLog(@"texture: %@", texture);
      if (texture != nil) {
          texture.filteringMode = SKTextureFilteringNearest;
      
          SKSpriteNode *spriteText = [SKSpriteNode spriteNodeWithTexture:texture];
          DLog(@"spriteText.size: %@", NSStringFromSize(spriteText.size));
          spriteText.anchorPoint = ccp(0, 0.5);
          spriteText.position = ccp(0, 25);
      
          [self addChild:spriteText];
      
          [spriteText runAction:[SKAction repeatActionForever:[SKAction sequence:@[
                                                                                   [SKAction colorizeWithColor:SKColor.yellowColor colorBlendFactor:1 duration:1],
                                                                                   [SKAction colorizeWithColor:SKColor.yellowColor colorBlendFactor:0 duration:1],
                                                                                   ]]]];
      }
      else {
          DLog(@"Texture is nil!");
      }
      

      【讨论】:

        【解决方案4】:

        如果您想为 SKLabelNode 着色,可以尝试使用标签作为蒙版并为背景着色:

        SKSpriteNode *background = [SKSpriteNode spriteNodeWithColor:[UIColor whiteColor] size:CGSizeMake(200.0, 200.0)];
        SKAction *turnRed = [SKAction colorizeWithColor:[UIColor redColor] colorBlendFactor:1.0 duration:2.0];
        
        SKCropNode *cropNode = [SKCropNode node];
        cropNode.maskNode = [yourAwesomeLabel copy];
        [cropNode addChild:background];
        
        [background runAction:turnRed];
        
        [self addChild:cropNode];
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-12-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-05-18
          相关资源
          最近更新 更多