0

考虑到帖子的滥用主题(例如thisthis),但我仍然没有安静地设法得到我想要的东西。

我正在开发一款射击游戏,我想在敌人(以及玩家)被击中时照亮他们。

如果我运行以下命令,我的精灵不会变白。这是正确的方向吗?

-(void) gothitAnimation
{
ccColor3B originalColor = self.color;
id delay = [CCDelayTime actionWithDuration:0.4f];
[self runAction:[CCSequence actions: [CCTintTo actionWithDuration:0.01f red:255 green:240 blue:240], delay, [CCTintTo actionWithDuration:0.01f red:originalColor.r green:originalColor.g blue:originalColor.b] ,  nil]];
}

我试过只运行 CCTintTo 动作,它只适用于不同于白色的颜色。

我找到了 Arodius 的游戏演示,在我看来,玩家飞船在被击中或处于较低能量水平时多次设置为不可见和可见(参见 此演示)。敌人在被击中时也会有灯光效果。

关于如何实现这一目标的任何想法?开发人员是否使用了 CCTintTo 操作或其他方式?我知道他在爆炸中使用了 ParticleEffects。

4

2 回答 2

3

精灵的默认色调颜色是白色。因此,您不能将其着色为白色或通过着色使精灵看起来更亮。

可以通过间隔设置可见属性打开和关闭来实现闪烁。一种方法是使用 CCBlink 操作。

最好的选择是使用粒子效果。只有在使用 cocos2d 2.0 并为此特定效果编写片段着色器时,才能实现真正的光照效果。

于 2012-07-27T16:34:21.763 回答
2

我最近需要做同样的事情,并且不想处理像素着色器。我想我可以弄乱纹理如何融入场景以从中获得某种白色闪光。

因此,我通过反复将精灵的 Destination glBlend 函数从 GL_ONE_MINUS_SRC_ALPHA 更改为 GL_ONE,然后再返回,找到了一个合理的闪光效果。

这是我的切换方法:

-(void)toggleBlendFlash {
    if (sprite_) {
        ccBlendFunc blendFunc = sprite_.blendFunc;
        if (blendFunc.dst == GL_ONE_MINUS_SRC_ALPHA) {
            blendFunc.dst = GL_ONE; //flash white
        } else {
            blendFunc.dst = GL_ONE_MINUS_SRC_ALPHA; //default
        }
        sprite_.blendFunc = blendFunc;
    }
}

这是我的闪烁顺序:

CCSequence *sequence =
        [CCSequence actions:
         [CCCallFunc actionWithTarget:targetEnemy selector:@selector(toggleBlendFlash)],
         [CCDelayTime actionWithDuration:0.3],
         [CCCallFunc actionWithTarget:targetEnemy selector:@selector(toggleBlendFlash)],
         [CCDelayTime actionWithDuration:0.2], nil ];

它可能看起来不适合您的情况,但请试一试!


编辑 1:此外,请查看这些链接以获取更多信息/资源:

编辑2:

当然,我刚刚意识到,如果您的精灵在不同的 CCTexture2D 对象之间进行动画处理(例如,您每帧有 1 个文件),那么它会为每一帧重置您的 blendFunc,这意味着您必须为 CCSprite 或创建一个类别或子类CCAnimate 重新应用您的自定义 blendFunc ......所以我想它的解决方案不像我最初想象的那么快。

于 2012-07-27T17:52:44.787 回答