我正在Linux上使用Java2D创建一个类似ascii的地图的游戏(就像roguelike)。
通过Graphics2D.drawImage渲染BufferedImages,渲染地形。我想动态改变每个绘制图像的色调,而不会过多地损害性能。我怎样才能做到这一点?
我怀疑setComposite是这个难题的一部分。目前我不需要保持背景完整(因此透明度不是问题)。我想使用各种各样的颜色,所以预生成的有色精灵对我来说不是一个解决方案。
答案 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();
}