Scintillement image de fond

cs_Juls Messages postés 41 Date d'inscription lundi 10 mars 2003 Statut Membre Dernière intervention 16 juillet 2003 - 30 avril 2003 à 11:26
eldered Messages postés 232 Date d'inscription vendredi 21 mars 2003 Statut Membre Dernière intervention 25 mai 2022 - 4 mars 2004 à 13:17
Bonjour
Je rencontre un problème de scintillement d'une image de fond (image.jpeg) . Le prog redessine un objet mobile (voiture simulée par un cercle ) sur un parcours (l'image de fond en question) . La fonction repaint est cadencé par le timer c'est pour cela je suppose que mon image de fond effectue un scintillement désagréable .
Existerait il un moyen pour eviter se scintillement .
Peut on effectuer une surdéfinition de la fonction paint ou à l'intérieur de celle ci empécher que l'image de fond soit redéssinné à chaque appel à repaint() .

Merci pour vos suggestion .

Juls

4 réponses

cs_Duss Messages postés 890 Date d'inscription lundi 8 avril 2002 Statut Membre Dernière intervention 29 juillet 2004 11
30 avril 2003 à 11:38
salut,
oui tu peux redefinir la fonction paint et a l interieur faire un test par exemple qui eviterait de redessiner ton image
Duss
0
cs_Juls Messages postés 41 Date d'inscription lundi 10 mars 2003 Statut Membre Dernière intervention 16 juillet 2003 4
30 avril 2003 à 12:30
J'ai essayé la deuxiéme solution manque de chance l'image de fond disparait au premier evenement timer lorsque le prog redessine les cercles .
J'ai peur que la premiere solution ne fasse pareil car normalement pour voir apparaitre mes cercles sur le parcours je dois les dessiner aprés l'image de fond c'est pour cela que le fait de ne pas la redessiner la rend invisible . Existe-t-il une fonction qui pourrait résoudre se problème en indiquant au compil que cette image est par defaut mon image de fond ???
0
cs_raff Messages postés 182 Date d'inscription dimanche 18 août 2002 Statut Membre Dernière intervention 5 janvier 2004 3
1 mai 2003 à 05:16
he he c'est drôle cette idée "d'image de fond" !!!

non, ce n'est pas possible. la solution s'appelle le "double buffering" et c'est beaucoup plus simple qu'il n'y parait de prime abord.

d'abord, tu as besoin d'un objet Image, que tu trouves dans le package java.awt ; ensuite un objet Graphics :

Image offImage;
Graphics offGraphics;

puis, au lancement du programme, tu peux assigner ces variables comme suit :

(la méthode createImage est implémenté dans les classes awt, je crois)

offImage = createImage(largeur, hauteur);
offGraphics = offImage.getGraphics();

ce que tu fais ici, c'est créer une image de la grandeur que tu veux (la grandeur de la zone à dessiner) et puis tu accèdes aux graphiques de cette images. Par la suite, dans la méthode paint() de ton applet, tu utilises cet objet (offGraphics) pour dessiner ce que tu veux, en prenant soin de redessiner le fond au complet.

offGraphics.setColor(la couleur que tu veux);
offGraphics.fillRect(x,y,w,h);

et puis les cercles :

offGraphics.fillOval(x,y,w,h);

une fois que tu as tout dessiné, tu dessines l'image sur l'objet Graphics passé en paramètre à la méthode paint :

g.drawImage(offImage, 0, 0, this);

Et voilà ! Ce que le double buffering fait, c'est de dessiner sur une image tampon, tous les graphiques nécessaires, puis de dessiner cette image, d'un seul coup, sur l'écran.

Autre chose, pour améliorer le tout, c'est qu'il faut aussi implémenter (en particulier si tu utilises l'instruction repaint) la méthode update() de l'applet :

public void update() {
paint(this.getGraphics());
}

Car lorsque tu appelles un repaint() sur un objet awt ou swing, la méthode update() est appellée automatiquement : alors celle-ci contient une routine qui efface les graphiques - un "clear" - ce qui cause le scintillement. Mais tu n'as plus besoin de vider l'écran parceque tu peints tout au même moment.

Voilà, j'espère t'avoir aidé un peu.

raff
0
eldered Messages postés 232 Date d'inscription vendredi 21 mars 2003 Statut Membre Dernière intervention 25 mai 2022
4 mars 2004 à 13:17
Nikel ton explication !

Merci bien, j'en avais besoin !!!

++

-----------------------------
Membre de la blindprod :
0
Rejoignez-nous