[Swing] Problème avec getGraphics() et drawImage()
Bonjour,
Je vais essayer d'expliquer au mieux mon problème tout en ajoutant que la partie de code intéressante.
Je développe un labyrinthe sur lequel je vais déplacer un personnage.
Je souhaite représenter ce personnage par une image.
Voici mon code :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
|
public class Labyrinthe extends JPanel implements Runnable {
private int numero;
private Monde monde;
private ParamsJeu paramsJeu;
public void paintComponent(Graphics g) {
super.paintComponent(g);
monde.dessine(g);
}
public void prepare() {
// niveau 1
if (paramsJeu.getNiveau() == 1) {
}
// niveau 2
else if (paramsJeu.getNiveau() == 2) {
// premier labyrinthe
if (numero == LABYRINTHE_1) {
this.requestFocus();
paramsJeu.getPerso1().dessine(getGraphics());
addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_LEFT) {
paramsJeu.getPerso1().deplaceVers(monde, paramsJeu.getPerso1().getPosX(), paramsJeu.getPerso1().getPosY()-1*Monde.getTaillePixel());
paramsJeu.getPerso1().dessine(getGraphics());
} else if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
paramsJeu.getPerso1().deplaceVers(monde, paramsJeu.getPerso1().getPosX(), paramsJeu.getPerso1().getPosY()+1*Monde.getTaillePixel());
paramsJeu.getPerso1().dessine(getGraphics());
} else if (e.getKeyCode() == KeyEvent.VK_UP) {
paramsJeu.getPerso1().deplaceVers(monde, paramsJeu.getPerso1().getPosX()-1*Monde.getTaillePixel(), paramsJeu.getPerso1().getPosY());
paramsJeu.getPerso1().dessine(getGraphics());
} else if (e.getKeyCode() == KeyEvent.VK_DOWN) {
paramsJeu.getPerso1().deplaceVers(monde, paramsJeu.getPerso1().getPosX()+1*Monde.getTaillePixel(), paramsJeu.getPerso1().getPosY());
paramsJeu.getPerso1().dessine(getGraphics());
}
}
});
}
// deuxieme labyrinthe
else {
addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
// TODO
}
public void mouseReleased(MouseEvent e) {
// TODO
}
});
addMouseMotionListener(new MouseMotionAdapter() {
public void mouseDragged(MouseEvent e) {
// TODO
}
});
}
}
// niveau 3
else {
}
}
public class Personnage {
// coordonnees initiales du personnage
private static int initX = 19;
private static int initY = 6;
private String nom;
private int oldX;
private int oldY;
private int posX;
private int posY;
private Image image;
private Personnage() {
oldX = posX = initX * Monde.getTaillePixel();
oldY = posY = initY * Monde.getTaillePixel();
}
public Personnage(String nom, String fichierImage) {
this();
this.nom = nom;
this.image = Toolkit.getDefaultToolkit().getImage(fichierImage);
}
// dessine un carre blanc a l'ancienne position
// dessine l'image a la nouvelle position
public void dessine(Graphics g) {
g.setColor(Color.RED);
g.fillRect(oldY, oldX, Monde.getTaillePixel(), Monde.getTaillePixel());
g.drawImage(image, posY, posX, null);
}
// newX, newY : coordonnees absolues (multipliees par getTaillePixel())
public void deplaceVers(Monde m, int newX, int newY) {
// les coordonnees reelles se referent aux indices de la matrice Monde
// si les nouvelles coordonnees chevauchent deux cases de taille getTaillePixel(), on teste la matrice sur la deuxieme case
int realX = newX % Monde.getTaillePixel() == 0 ? newX / Monde.getTaillePixel() : newX / Monde.getTaillePixel() + 1;
int realY = newY % Monde.getTaillePixel() == 0 ? newY / Monde.getTaillePixel() : newY / Monde.getTaillePixel() + 1;
if (realX >= 0 && realX < Monde.getNbL() && realY >= 0 && realY < Monde.getNbC()
&& !m.isMurAt(realX, realY)) {
oldX = posX;
oldY = posY;
posX = newX;
posY = newY;
}
}
public int getPosX() {
return posX;
}
public int getPosY() {
return posY;
}
} |
Mon problème est que lors de l'appel dans prepare() de paramsJeu.getPerso1().dessine(getGraphics()); il m'affiche mon carré rouge (en fait il sera blanc par la suite pour effacer l'ancienne position avant le déplacement) mais ensuite n'affiche pas l'image.
Je ne comprends donc pas pourquoi lors de l'affichage du perso à sa position initiale, seul le carré rouge s'affiche et n'est pas écrasé par l'image. Il faut que je commence à déplacer mon perso avec les touches pour que l'image s'affiche à la place du carré rouge. 8O
Merci d'avance pour vos réponses.