java - libgdx 在受伤时改变 Sprite 颜色

标签 java colors libgdx sprite game-engine

我正在使用 libgdx 制作一个小平台游戏,我想让敌人在玩家用武器伤害他们时以红色闪烁。

我已经尝试更改 Sprite 颜色和 Sprite 批处理颜色但没有成功,它只能将新颜色与纹理之一融合。

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

我想要达到的效果是:

enter image description here

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

最佳答案

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

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

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

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);

关于java - libgdx 在受伤时改变 Sprite 颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24099103/

相关文章:

java - 导入无法解决?

java - 在 Activity 中使用内部 BroadcastReceiver 时出现内存问题

javascript - JavaScript 初学者 - 汽车颜色

java - Libgdx 游戏在重启时越来越慢

java - 同时显示两个不同 Activity 的两个倒计时器

java - 如何在android中获取rss feed

Android:Spinner 小部件的文本颜色属性隐藏在哪里?

java - 在 Java 中获取十六进制颜色的名称?

java - 调用 new World() 时出现 UnsatisfiedLinkError

android-studio - Libgdx 桌面版本无法编译