我正在使用 Linux 上的 Java2D 创建一个带有类似 ascii 的地图的游戏(如 roguelike)。
通过 Graphics2D.drawImage 渲染 BufferedImages 可以渲染地形。我想动态更改每个绘制图像的色调,而不会对性能造成太大影响。我怎样才能做到这一点?
我怀疑 setComposite 是难题的一部分。目前我不需要保持背景完整(所以透明度不是问题)。我想使用多种颜色,所以预生成着色精灵对我来说不是一个解决方案。
不久前我问了一个类似的问题,并在这里得到了一个很好的答案,尽管我提前做了所有的着色。在任何情况下,您都可能希望查看 BufferedImageOp。此外,JH Labs 网站有大量关于在 java 中进行图像处理的有用信息。
为了获得高性能,您可能需要使用 JOGL。它使您可以很好地访问硬件加速,即使您不需要 3D 功能。
鉴于 Tom Hawtin 的回答,我决定切换到一个允许更多控制的框架。JOGL 和 LWJGL 似乎都提供了对着色机制的访问。我选择了 LWJGL,因为它与我的其他需求重叠更多。
我发现这个Space Invaders 教程很有用,因为它是 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();
}