在Java2D中动态调色精灵?

时间:2009-02-24 09:01:33

标签: java java-2d

我正在Linux上使用Java2D创建一个类似ascii的地图的游戏(就像roguelike)。

通过Graphics2D.drawImage渲染BufferedImages,渲染地形。我想动态改变每个绘制图像的色调,而不会过多地损害性能。我怎样才能做到这一点?

我怀疑setComposite是这个难题的一部分。目前我不需要保持背景完整(因此透明度不是问题)。我想使用各种各样的颜色,所以预生成的有色精灵对我来说不是一个解决方案。

3 个答案:

答案 0 :(得分:2)

前一段时间我问了一个类似的问题并得到了一个非常好的答案here,尽管我提前做了所有的着色。无论如何,你可能想看看BufferedImageOp。此外,JH Labs site在java中进行图像处理方面有很多有用的信息。

答案 1 :(得分:1)

为了获得高性能,您可能需要使用JOGL。即使您不需要3D功能,它也可以很好地访问硬件加速。

答案 2 :(得分:0)

鉴于Tom Hawtin的回答,我决定改用一个允许更多控制的框架。 JOGL和LWJGL似乎都提供了对着色机制的访问。我选择了LWJGL,因为它与我的其他需求重叠更多。

我发现这个Space Invaders Tutorial非常有用,因为它是Java2D和JOGL,LWJGL之间的一个很好的结果。

这是我为LWJGL Sprite类创建的方法。

public void drawTinted(int x, int y, float red, float green, float blue) 
{
    GL11.glPushMatrix();

    texture.bind();

    GL11.glTranslatef(x, y, 0);     
    GL11.glColor3f(red,green,blue);

    GL11.glBegin(GL11.GL_QUADS);
    {
      GL11.glTexCoord2f(0, 0);
      GL11.glVertex2f(0, 0);
      GL11.glTexCoord2f(0, texture.getHeight());
      GL11.glVertex2f(0, height);
      GL11.glTexCoord2f(texture.getWidth(), texture.getHeight());
      GL11.glVertex2f(width,height);
      GL11.glTexCoord2f(texture.getWidth(), 0);
      GL11.glVertex2f(width,0);
    }
    GL11.glEnd();

    GL11.glPopMatrix();
}