PB: repaint() efface les cercles précédents

moreelsc Messages postés 20 Date d'inscription jeudi 15 avril 2010 Statut Membre Dernière intervention 18 mai 2010 - 16 avril 2010 à 21:08
uhrand Messages postés 491 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 15 juillet 2012 - 16 avril 2010 à 23:43
Bonjour,

Dans le cadre d'un projet je dois réaliser un jeu. Celui-ci contient des pions représentés par des cercles affichés via la méthode paint(Graphics g).
Le parcours de mon plateau de jeu est représenté par un tableau (un index du tableau par case de jeu). 4 joueurs sont présents (rouge, vert, jaune, bleu). Si la valeur de tableau est 0 c'est que personne n'est sur la case.
1 = rouge
2=vert
3=jaune
4=bleu
Sur mon plateau doivent bien-sûr apparaître les différents pions.
Or, en instanciant le plateau de jeu, je parcours mon tableau avec une boucle for et pour chaque index différent de 0 je fais un repaint() sur la case correspondante pour qu'il affiche le pion. Le problème est que seule la dernière case non vide du tableau affiche son pion. Apparement le repaint() efface les pions précédents. Pourtant je fais le repaint() que sur l'espace occupée par la case et non sur tout le plateau de jeu...
Voici une partie du code.
D'avance merci pour votre aide...

//instances:
int x=0;
int y=0;
final int longueur=36;
final int largeur=37;
Image img; 
Color c=Color.RED;


//dans le constructeur du plateau
for(int i=0;i<parcours.nombreCases;i++)
{
    if(parcours.getCase(i).getOccupation()!=0)
    {
   
         if (parcours.getCase(i).getOccupation()==1)
{
//Peindre un cercle rouge aux coordonnées de la case située dans le ième index du tableau tab de parcours                                  c=Color.red;					                        x=parcours.getCase(i).getXPosition();
y=parcours.getCase(i).getYPosition();
repaint(x,y,longueur,largeur);
}
if(parcours.getCase(i).getOccupation()==2)
{
//Peindre un cercle rouge aux coordonnées de la case située dans le ième index du tableau tab de parcours
c=Color.yellow;
x=parcours.getCase(i).getXPosition();
y=parcours.getCase(i).getYPosition();
repaint(x,y,longueur,largeur);
}
if(parcours.getCase(i).getOccupation()==3)
{
c=Color.blue;
x=parcours.getCase(i).getXPosition();
y=parcours.getCase(i).getYPosition();
repaint(x,y,longueur,largeur);
}
if(parcours.getCase(i).getOccupation()==4)
{
c=Color.green;
x=parcours.getCase(i).getXPosition();
y=parcours.getCase(i).getYPosition();
repaint(x,y,longueur,largeur);
}
}
}

//Autre classe
public void paintComponent(Graphics g) 
{
// Charge l'image du plateau dans la fenetre
    g.drawImage(img, 0, 0, this.getWidth(), this.getHeight(), this);
    g.setColor(c);
    g.fillOval(x,y,longueur,largeur);
} 

2 réponses

cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 131
16 avril 2010 à 21:48
Salut,

C'est tout simple : tu retrace à chaque repaint le plateau de jeu, et ensuite tu trace le pion, sauf qu'en traçant le plateau de jeu sur toute la surface, tu effaces tout les pions déjà tracés...

Invalide plutôt uniquement le rectangle qui doit être tracé : quand tu fais "repaint(x,y,longueur,largeur);" tu spécifie les coordonnées d'un rectangle à retracer (x, y, longueur, largeur), il te suffit alors de récupérer ce rectangle (par getClip()) et ne retracer que ce rectangle :

public void paintComponent(Graphics g) 
{
                    Rectangle clip = g.getClipBounds(); // récupère la zone à retracer
    // Charge l'image du plateau dans la fenetre
    g.drawImage(img, clip.getX(), clip.getY(), clip.getWidth(), clip.getHeight(), clip.getX(), clip.getY(), clip.getWidth(), clip.getHeight(), this);
    g.setColor(c);
    g.fillOval(clip.getX(), clip.getY(), clip.getWidth(), clip.getHeight());
} 


Cependant ce code n'est pas vraiment correct : si Swing demande de retracer ta fenêtre, il va te passer les coordonnées qui sont à retracer, et là il va te retracer tout le plateau de jeu, et 1 ovale de la taille de la fenêtre.

Le plus simple (et plus optimisé) c'est de tracer tes ovales dans une image temporaire avec un fond transparent, et de tracer cette image par dessus ton image de fond dans le paintComponent.


______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
0
Rejoignez-nous