2009-02-24 11 views
2

Je suis en train de créer un jeu avec une carte de type ascii utilisant Java2D sous Linux (comme une rogue).sprites teintant dans Java2D à la volée?

En rendant BufferedImages via Graphics2D.drawImage, le terrain est rendu. Je voudrais changer la teinte de chaque image dessinée à la volée, sans trop nuire à la performance. Comment puis-je atteindre cet objectif?

Je suppose que setComposite fait partie du puzzle. Actuellement, je n'ai pas besoin de garder l'arrière-plan intact (donc la transparence n'est pas un problème). Je veux utiliser une grande variété de couleurs, donc les sprites teintés pré-générateurs ne sont pas une solution pour moi.

Répondre

1

Pour des performances élevées, vous pouvez utiliser JOGL. Il vous donne un bon accès à l'accélération matérielle, même si vous n'avez pas besoin de fonctionnalités 3D.

2

J'ai posé une question similaire il y a un certain temps et j'ai obtenu une assez bonne réponse here, même si je faisais toute la coloration à l'avance. Dans tous les cas, vous voudrez probablement regarder BufferedImageOp. En outre, le JH Labs site a une tonne d'informations utiles sur le traitement de l'image en Java.

0

J'ai décidé de passer à un cadre qui permet plus de contrôle étant donné la réponse de Tom Hawtin. JOGL et LWJGL semblent tous deux donner accès à un mécanicien de teinture. J'ai opté pour LWJGL, car il se chevauche davantage avec mes autres besoins.

J'ai trouvé ce Space Invaders Tutorial utile car c'est une belle pierre de rosette entre Java2D et JOGL, LWJGL.

Voici la méthode que j'ai créée pour la classe Sprite LWJGL.

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(); 
} 
Questions connexes