2014-06-07 40 views
1

我正在使用libgdx來製作一個小平臺遊戲,並且我想讓敵人以紅色閃爍,同時玩家用武器傷害他們。libgdx在受到傷害時更改雪碧顏色

我已經嘗試改變sprite顏色和sprite批處理顏色沒有成功,它只融化與紋理之一的新顏色。

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

我想達到的效果是:

enter image description here

從精靈質感變爲滿紅色,然後再回來。 我認爲這與Blending功能有關,但我不確定這一點。我想避免爲我的遊戲中的每個怪物製造一些紅色精靈。 有人知道如何達到這個效果嗎?

+0

您是否將蝙蝠的顏色手動設置爲變量batBlack,batGrey,batRed?如果是這樣,請更改這些值以表示您想要的效果。 – Hayden

+0

圖像是一個簡單的PNG雪碧與固定的顏色,我想要做的是不修改像素的源或顏色像素。我想我需要一個面具或類似的東西 –

+2

使用着色器 - https://www.youtube.com/watch?v=1mIdNru2VO0 –

回答

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

謝謝你的提示,它的工作。起初我想避免使用着色器來達到這個目的,但似乎這是最好的方法。但是如果我想要應用多個着色器程序呢?我會被迫使用FBO嗎? –

+0

我不太清楚你的意思。我會做的是,對於遊戲中的每一層,將你的精靈將這個框架變成一個單獨的列表。首先繪製所有常規精靈,然後將着色器更改爲自定義着色器並繪製紅色精靈,然後將着色器更改回空(將其切換回默認值)。 – Tenfour04

+0

嘿@ Tenfour04,謝謝你的回答,它幫助了我。有沒有辦法使用參數c_color爲該着色器設置選定的顏色程序模式?在代碼中這麼做很熱? – Don