Sprite-Kit的colorizeWithColor方法不能正确混合精灵和颜色。

4
我在场景中有一个精灵(血条),我希望每当玩家受到攻击时,它的颜色会发生变化。我可以使用greenColor和blueColor来给我的精灵上色。然而,redColor、brownColor、yellowColor、cyanColor和whiteColor似乎都不起作用。
精灵: enter image description here _healthBar 代码:
SKAction *pulseRed = [SKAction sequence:@[
[SKAction colorizeWithColor:[SKColor redColor] colorBlendFactor:1.0 duration:0.15],
[SKAction waitForDuration:0.1],
[SKAction colorizeWithColorBlendFactor:0.0 duration:0.15]]];

SKAction *repeat   = [SKAction repeatActionForever:pulseRed];

[_healthBar runAction: repeat];

输出:

enter image description here [SKColor redColor] 不起作用

其他颜色:

enter image description here [SKColor yellowColor] 不起作用

enter image description here [SKColor blueColor] 起作用

enter image description here [SKColor greenColor] 起作用

黄色似乎是有道理的,因为黄色和蓝色可以组成绿色。但我不认为这是在这里发生的事情。

有什么想法吗?


编辑:

有一种解决方法,其他人在下面已经暗示过了,对于矩形精灵(基本上在纹理上创建一个着色的精灵),这个方法非常有效。然而,我想找到一个不仅适用于矩形精灵的解决方案,因为我将使用这种策略来给我的游戏中的其他精灵上色。

着色矩形精灵的解决方案(Ahmet Cevdet):

@interface

@property (strong, nonatomic) SKSpriteNode  *filterNode;

@implementation

CGSize filterSize = CGSizeMake(_healthBar.size.width, _healthBar.size.height);
SKColor *filterColor = [SKColor redColor];

_filterNode = [SKSpriteNode spriteNodeWithColor:filterColor size:filterSize];
_filterNode.alpha = 0;
[_healthBar addChild:_filterNode];

SKAction *fadeIn = [SKAction fadeAlphaTo:.6 duration:.15];
SKAction *fadeOut = [SKAction fadeAlphaTo:0 duration:.15];
SKAction *wait = [SKAction waitForDuration:0.1];

[_filterNode runAction:[SKAction repeatActionForever:[SKAction sequence:@[fadeIn,wait,fadeOut]]] withKey:@"pulseRed"];

1
我遇到了类似的问题,使用 [SKColor whiteColor] 闪烁来使其变成白色。但它实际上什么也没做。我认为它是从精灵中添加或减去特定颜色,或者类似于这样的操作。我无法准确解释,但我解决它的方法是添加一个相同大小的带有所需颜色的精灵,并将其放置在血条的顶部,然后淡入淡出 alpha 值。这是一个有点不靠谱的解决方法,但它起作用了。 - Andy Heard
@Andy,你是对的。如果我将我的精灵改成白色条,它就可以正常工作。只有当精灵被着色时才会出现这种奇怪的效果。 - JRam13
1个回答

3

以下是您所需的代码,希望能对您有所帮助;

@implementation MyScene
{
    float filterParameter;
}

-(id)initWithSize:(CGSize)size {

    if (self = [super initWithSize:size]) {
        /* Setup your scene here */

        self.backgroundColor = [SKColor colorWithRed:0.15 green:0.15 blue:0.3 alpha:1.0];

        SKSpriteNode *healthBar = [SKSpriteNode spriteNodeWithImageNamed:@"health"];
        healthBar.position = CGPointMake(self.size.width/2, self.size.height/2);

        SKEffectNode *effectNode = [SKEffectNode node];
        [effectNode addChild:healthBar];
        [self addChild:effectNode];

        filterParameter = 0;

        CIFilter *filter = [CIFilter filterWithName:@"CIHueAdjust"];
        [filter setValue:[NSNumber numberWithFloat:filterParameter] forKey:@"inputAngle"];
        effectNode.filter = filter;
        effectNode.shouldEnableEffects = YES;

        SKAction *wait =[SKAction waitForDuration:0.1];
        SKAction *block = [SKAction runBlock:^{
            filterParameter += 0.1;
            [filter setValue:[NSNumber numberWithFloat:filterParameter] forKey:@"inputAngle"];
            NSLog(@"%f", filterParameter);
        }];

        [effectNode runAction:[SKAction repeatActionForever:[SKAction sequence:@[block, wait]]]];

    }
    return self;
}

@end

这是一个很好的解决方法。然而,它只适用于矩形精灵(在我的情况下确实如此)。将来,我想在敌人和BOSS受到伤害时对不规则精灵进行染色。 - JRam13
谢谢,伙计。为了你,我按照你的要求编辑了代码,希望这次能有所帮助 :) - Ahmet Hayrullahoglu
Ahmet,在这里对血条精灵进行着色也不起作用:( 这本质上与我的原始示例相同的代码(尽管您使用了块和colorWith) 。结果也是一样的。不过,您应该保留原来的答案,因为那确实有效。 - JRam13
嗯,我现在会尝试一种新的方法,然后告诉你。 - Ahmet Hayrullahoglu
我也很震惊为什么着色不起作用,希望他们能通过新的Sprite Kit改进尽快解决这个问题。 - Ahmet Hayrullahoglu
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接