2

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

通过 Graphics2D.drawImage 渲染 BufferedImages 可以渲染地形。我想动态更改每个绘制图像的色调,而不会对性能造成太大影响。我怎样才能做到这一点?

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

4

3 回答 3

2

不久前我问了一个类似的问题,并在这里得到了一个很好的答案,尽管我提前做了所有的着色。在任何情况下,您都可能希望查看 BufferedImageOp。此外,JH Labs 网站有大量关于在 java 中进行图像处理的有用信息。

于 2009-02-24T09:16:25.460 回答
1

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

于 2009-02-24T11:23:35.030 回答
0

鉴于 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();
}
于 2009-02-24T14:51:26.263 回答