Bonjour
Alors, voilà le problème en gros : Je me suis créé une classe Sprite, qui manipule une classe Graphics2D et un objet de classe BufferedImage, qui se charge depuis un fichier. L'intérêt est de me faciliter la manipulation d'une image puis de l'intégrer dans une autre classe qui permettra de jouer des animations.
Seulement, voilà le problème, à chaque fois que je fais subir un déplacement ou une transformation à mon sprite, je suis obligé de le redessiner, j'utilise donc successivement les méthodes Graphics2D.clearRect(), qui efface l'image à sa position précédente, et Graphics2D.drawImage() qui la redessine à sa nouvelle position. Sans ça, mon image se fait redessiner par dessus l'ancienne image.
Mais voilà, faire ça, c'est lent, et du coup, à chaque transformation, deplacement etc, l'effaçage est visible à l'oeil nu, et c'est très moche, l'image clignote
.
Je précise que mon Graphics2D utilise le contexte graphique d'un JPanel.
Donc voilà, j'aimerais savoir comment m'affranchir de ce clignotement très moche
Voilà mon code (désolé pour l'indentation) :
Ici, la classe Sprite :
package graphismes;
import javax.imageio.*;
import java.awt.image.*;
import java.awt.*;
import java.io.*;
import javax.swing.*;
/**
*
* @author Onche
*/
public class Sprite {
private BufferedImage imgMemoire;
private Graphics2D g;
private int posX, posY, posXPrec, posYPrec, gX, gY;
private double rotation;
public Sprite(String lien, JPanel supportDessin){
super();
try{
imgMemoire = ImageIO.read(new File(lien));
}catch(IOException e) {
System.out.println("Impossible de charger " + lien + " " + e.getMessage() );
}
finally{
posX = 0;
posY = 0;
posXPrec = 0;
posYPrec = 0;
gX = imgMemoire.getWidth()/2;
gY = imgMemoire.getHeight()/2;
rotation = 0;
g = (Graphics2D) supportDessin.getGraphics();
}
}
/**
* Modifie la position acutelle du sprite, et met à jour sa position
* précédente. Ne redessine pas le sprite, pour cela, utiliser deplacer().
*
* @param x : nouvelle position x sur le JFrame.
* @param y : nouvelle position y sur le JFrame.
*/
public void setPosition(int x, int y){
posXPrec = posX;
posYPrec = posY;
posX = x;
posY = y;
gX = posX + imgMemoire.getWidth()/2;
gY = posY + imgMemoire.getHeight()/2;
}
/**
* Dessine le sprite à sa position actuelle.
*/
public void dessiner(){
g.drawImage(imgMemoire, posX, posY, null);
}
/**
* Efface le sprite à sa position actuelle.
*/
public void effacer(){
g.clearRect(posX, posY, imgMemoire.getWidth()+1, imgMemoire.getHeight()+1);
}
/**
* Efface le sprite à sa position précédente.
*/
public void effacerPrecedent(){
g.clearRect(posXPrec, posYPrec, imgMemoire.getWidth()+1, imgMemoire.getHeight()+1);
}
/**
* Déplace le sprite à la position désirée sur le JFrame. La différence
* avec setPosition() est qu'il dessine la sprite à sa nouvelle postion.
*
* @param x : nouvelle position x sur le JFrame.
* @param y : nouvelle position x sur le JFrame.
*/
public void deplacerA(int x, int y){
setPosition(x, y);
effacerPrecedent();
dessiner();
}
/**
* Fait tourner le sprite autour de son origine.
*
* @param angle : rotation angulaire à ajouter.
*/
public void tourner(double angle){
effacer();
g.rotate(Math.toRadians(angle), gY, gX);
dessiner();
rotation += angle;
}
/**
* Fait tourner le sprite autour d'un point.
*
* @param angle : rotation angulaire à ajouter.
* @param x : position x du centre de rotation.
* @param y : position y du centre de rotation.
*/
public void tourner(double angle, int x, int y){
effacer();
g.rotate(Math.toRadians(angle), x, y);
dessiner();
rotation += angle;
}
public void setPositionAngulaire(double angle){
effacer();
g.rotate(Math.toRadians(angle) - Math.toRadians(rotation), gX, gY);
dessiner();
rotation = angle;
}
/**
* Etale ou rétrécit l'image en largeur et/ou hauteur.
*
* @param larg : coefficient de redimensionnement en largeur.
* @param haut : coefficient de redimmensionnement en hauteur
*/
public void redimmensionner(double larg, double haut){
effacer();
g.scale(larg, haut);
gX = imgMemoire.getWidth()/2;
gY = imgMemoire.getHeight()/2;
dessiner();
}
}
Ma clase principale (sert de test) :
public class Robots {
/**
* @param args the command line arguments
*/
public static void main(String[] args) throws Exception{
Fenetre FenetrePrincipale = new Fenetre(100,100,640,480,"Robots");
int i,j;
String repertoireCourant = System.getProperty("user.dir").replace("\\", "/");
System.out.println(repertoireCourant);
i = 0;
Sprite toast = new Sprite( repertoireCourant + "/src/ressources/graph/sprites/robot.png", FenetrePrincipale.getJPanel() );
toast.dessiner();
toast.deplacerA(60, 60);
while (i<=500){
Thread.sleep(25);
toast.deplacerA(i,50);
i++;
}
toast.setPositionAngulaire(90);
toast.setPositionAngulaire(-50);
}