libgdx在伤害时改变精灵色

时间:2014-06-07 16:09:11

标签: java colors libgdx sprite game-engine

我正在使用libgdx做一个小平台游戏,我想让玩家用红色闪烁红色而玩家用武器伤害他们。

我已经尝试更改精灵颜色和精灵批次颜色没有成功,它只会使用纹理之一融化新颜色。

sprite.setColor(Color.RED);
spriteBatch.draw(sprite);

我想要达到的效果是:

enter image description here

从精灵纹理变为全红色,然后再返回。 我认为与混合功能有关,但我不确定。我想避免为我的游戏中的每个怪物制作一些红色精灵。 有人知道如何实现这种效果吗?

1 个答案:

答案 0 :(得分:3)

您可以创建这样的着色器来更改所有像素的颜色,而不是将它们乘以该颜色。通过调用spriteBatch.setShader(shader);将此着色器与SpriteBatch一起使用。

这基本上是默认的SpriteBatch着色器,除了最终颜色替换所有非alpha像素。

要使用此方法,必须将彩色精灵与正常精灵分开批处理。调用spriteBatch.setShader(null);返回绘制常规精灵。

String vertexShader = "attribute vec4 " + ShaderProgram.POSITION_ATTRIBUTE + ";\n" //
            + "attribute vec4 " + ShaderProgram.COLOR_ATTRIBUTE + ";\n" //
            + "attribute vec2 " + ShaderProgram.TEXCOORD_ATTRIBUTE + "0;\n" //
            + "uniform mat4 u_projTrans;\n" //
            + "varying vec4 v_color;\n" //
            + "varying vec2 v_texCoords;\n" //
            + "\n" //
            + "void main()\n" //
            + "{\n" //
            + "   v_color = " + ShaderProgram.COLOR_ATTRIBUTE + ";\n" //
            + "   v_texCoords = " + ShaderProgram.TEXCOORD_ATTRIBUTE + "0;\n" //
            + "   gl_Position =  u_projTrans * " + ShaderProgram.POSITION_ATTRIBUTE + ";\n" //
            + "}\n";
        String fragmentShader = "#ifdef GL_ES\n" //
            + "#define LOWP lowp\n" //
            + "precision mediump float;\n" //
            + "#else\n" //
            + "#define LOWP \n" //
            + "#endif\n" //
            + "varying LOWP vec4 v_color;\n" //
            + "varying vec2 v_texCoords;\n" //
            + "uniform sampler2D u_texture;\n" //
            + "void main()\n"//
            + "{\n" //
            + "  gl_FragColor = v_color * texture2D(u_texture, v_texCoords).a;\n" //
            + "}";

        ShaderProgram shader = new ShaderProgram(vertexShader, fragmentShader);