2009-02-24 3 views
2

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

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

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

ответ

1

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

2

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

0

Я решил переключиться на фреймворк, который позволил получить больше контроля, учитывая ответ Тома Хотина. Кажется, что 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(); 
}