2

SKAction colorizeWithColor:文档中的内容仅适用于,那么我们该SKSpriteNode怎么做SKLabelNode?SKLabelNode确实具有可以静态设置的color和属性。colorBlendFactor有什么方法可以用 SKAction 制作动画吗?

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

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

4

4 回答 4

4

也许有人会发现这很有用。

   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 使 SKLabelNode 消失

于 2014-11-19T01:51:21.947 回答
3

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 方法有效,但字体严重损坏且粗大。所以,没用。

于 2014-10-05T02:43:39.217 回答
2

所以这里是 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!");
}
于 2013-11-01T02:55:38.417 回答
2

如果要为 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];
于 2014-03-03T12:41:05.383 回答