тонировать спрайты в Java2D на лету? - PullRequest
2 голосов
/ 24 февраля 2009

Я создаю игру с ascii-подобной картой, используя Java2D в Linux (как roguelike).

При рендеринге BufferedImages через Graphics2D.drawImage рендеринг ландшафта. Я хотел бы изменить оттенок каждого нарисованного изображения на лету, не сильно снижая производительность. Как мне этого добиться?

Я подозреваю, что setComposite - часть головоломки. В настоящее время мне не нужно сохранять фон без изменений (поэтому прозрачность не является проблемой). Я хочу использовать самые разные цвета, поэтому предварительная генерация тонированных спрайтов не является для меня решением.

Ответы [ 3 ]

2 голосов
/ 24 февраля 2009

Я задал похожий вопрос некоторое время назад и получил довольно хороший ответ здесь , хотя я выполнял все тонировки заранее. В любом случае, вы, вероятно, захотите взглянуть на BufferedImageOp. Кроме того, на сайте JH Labs есть масса полезной информации о том, как выполнять обработку изображений в Java.

1 голос
/ 24 февраля 2009

Для высокой производительности вы можете использовать JOGL. Это дает вам хороший доступ к аппаратному ускорению, даже если вам не нужны 3D-функции.

0 голосов
/ 24 февраля 2009

Я решил переключиться на структуру, которая позволила больше контроля, учитывая ответ Тома Хоутина JOGL и LWJGL, кажется, предоставляют доступ к механике тонирования. Я выбрал LWJGL, так как он больше совпадает с моими другими потребностями.

Я нашел это Учебное пособие по космическим захватчикам полезным как прекрасный камень розетт между 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();
}
...