Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1166 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  Swing et le double-buffering.

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Swing et le double-buffering.

n°733973
amauryxiv
Posté le 21-05-2004 à 16:39:53  profilanswer
 

Salut a tous.
 
Pour ceux qui ne m'ont pas deja lu, j'essaie de faire un jeu sous swing.
(cf http://amauryxiv.no-ip.info:8080/pacman/pacman.htm quand mon serveur est en route).
 
J'essaie de comprendre le mecanisme de rafraichissement et d'affichage des composants swing.
 
Et ce que je ne comprends pas c'est comment marche le double-buffering. A cause de lui, j'ai plein de bugs quand j'essaie de faire certaines choses.
 
Sur la doc, (http://java.sun.com/products/jfc/t [...] html#swing) ils disent qu'on peut faire en sorte qu'il y ait un buffer par composant. Mais dans le javadoc, ils disent le contraire.
 
Est ce que quelqu'un aurait des précisions à m'apporter ?
 
Merci d'avance.


Message édité par amauryxiv le 21-05-2004 à 18:51:38

---------------
Amaury.
mood
Publicité
Posté le 21-05-2004 à 16:39:53  profilanswer
 

n°734626
amauryxiv
Posté le 22-05-2004 à 13:10:50  profilanswer
 

Bon alors, les soit-disant pro en java ? Y en a pas un seul qui connait ca ?


---------------
Amaury.
n°734662
nraynaud
lol
Posté le 22-05-2004 à 13:55:33  profilanswer
 

amauryxiv a écrit :

Bon alors, les soit-disant pro en java ? Y en a pas un seul qui connait ca ?

peut-être un problème de motivation pour te répondre ...


---------------
trainoo.com, c'est fini
n°734665
amauryxiv
Posté le 22-05-2004 à 13:56:54  profilanswer
 

nraynaud a écrit :

peut-être un problème de motivation pour te répondre ...


Et pourquoi ma question motiverait moins qu'une autre ?


---------------
Amaury.
n°734673
nraynaud
lol
Posté le 22-05-2004 à 14:03:16  profilanswer
 

bof, le newbies qui ont un pb, mais prétendent déjà savoir où il n'est pas ça ne m'engage pas.
 
Et puis s'intéresser à un détail d'implémentation plutôt qu'à la recherche du bug, ça sent le sujet pas hyper-passionnant.
 
Enfin, le double-buffering de swing n'a aucun intérêt particulier, donc une éventuelle discussion là-dessus n'apporterait pas grand-choses aux autres.
 
 
si vraiment tu crois avoir trouvé un bug dans ce code, va le chercher sur la bugparade de java.


---------------
trainoo.com, c'est fini
n°734674
R3g
fonctionnaire certifié ITIL
Posté le 22-05-2004 à 14:03:23  profilanswer
 

amauryxiv a écrit :

Et pourquoi ma question motiverait moins qu'une autre ?

deja parce qu'on est samedi. Il faut savoir que la plupart des gens postent dans cette categorie pour éviter de bosser quand ils sont au taf.
 
Ensuite, tu as mal lu :

Citation :

Swing's double buffer mechanism uses a single offscreen buffer per containment hierarchy (usually per top-level window)


Il y a donc un buffer par ensemble de composants qui ont un lien de parenté.
 

Citation :

And although this property can be set on a per-component basis, the result of setting it on a particular container will have the effect of causing all lightweight components underneath that container to be rendered into the offscreen buffer, regardless of their individual "doubleBuffered" property values.


Deja la propriétés dont il parlent, c'est le booleen qui decide si le composant est oui ou non double-buffered, ils ne parlent pas du buffer lui-même.
Ensuite c'est clairement dit que si un container est double-buffered, tous ses descendants le seront, quoique tu leur dise.

n°734684
amauryxiv
Posté le 22-05-2004 à 14:08:05  profilanswer
 

Et ben voila j'en demandait pas plus ! Chuis une burne en anglais et pour moi les docs c'est pas tres clair.
Donc merci de bien vouloir m'expliquer ......


---------------
Amaury.
n°734690
amauryxiv
Posté le 22-05-2004 à 14:09:48  profilanswer
 

nraynaud a écrit :

bof, le newbies qui ont un pb, mais prétendent déjà savoir où il n'est pas ça ne m'engage pas.
 
Et puis s'intéresser à un détail d'implémentation plutôt qu'à la recherche du bug, ça sent le sujet pas hyper-passionnant.
 
Enfin, le double-buffering de swing n'a aucun intérêt particulier, donc une éventuelle discussion là-dessus n'apporterait pas grand-choses aux autres.
 
 
si vraiment tu crois avoir trouvé un bug dans ce code, va le chercher sur la bugparade de java.


 
Ca va les chevilles ? Excuse moi mais t'as pas l'air de comprendre beaucoup mieux que moi. Donc avant de qualifier quelqu'un de newbie et de te prendre pour un pro tourne sept fois ta langue dans ta bouche !


---------------
Amaury.
n°734693
amauryxiv
Posté le 22-05-2004 à 14:13:24  profilanswer
 

nraynaud a écrit :

bof, le newbies qui ont un pb, mais prétendent déjà savoir où il n'est pas ça ne m'engage pas.
 
Et puis s'intéresser à un détail d'implémentation plutôt qu'à la recherche du bug, ça sent le sujet pas hyper-passionnant.
 
Enfin, le double-buffering de swing n'a aucun intérêt particulier, donc une éventuelle discussion là-dessus n'apporterait pas grand-choses aux autres.
 
 
si vraiment tu crois avoir trouvé un bug dans ce code, va le chercher sur la bugparade de java.


 
Et puis t'as pas bien compris ma demarche. J'ai jamais pretendu avoir trouve un bug dans le JDK (ché pas d'ou tu sors ca). Seulement vu la gueule du bug dans mon programme, il peut venir que de quelque chose que deux panels qui ont un parent en commun partagent. Partant de la ya des chances que ce soit en rapport avec le buffer. Donc ca veut dire que j'ai mal exploite le double-buffering. Et pour bien l'exploiter j'ai besoin de savoir comment ca marche.
C'est tout.


Message édité par amauryxiv le 22-05-2004 à 14:15:22

---------------
Amaury.
n°734706
nraynaud
lol
Posté le 22-05-2004 à 14:46:41  profilanswer
 

amauryxiv a écrit :

Ca va les chevilles ? Excuse moi mais t'as pas l'air de comprendre beaucoup mieux que moi.

t'inquiètes pas pour moi va. Le double-buffering semble me poser moins de problèmes qu'à toi, c'est embêtant pour un système sensé être invisible.


---------------
trainoo.com, c'est fini
mood
Publicité
Posté le 22-05-2004 à 14:46:41  profilanswer
 

n°734709
amauryxiv
Posté le 22-05-2004 à 14:57:26  profilanswer
 

nraynaud a écrit :

t'inquiètes pas pour moi va. Le double-buffering semble me poser moins de problèmes qu'à toi, c'est embêtant pour un système sensé être invisible.


 
De deux choses l'une: soit t'es aussi malin que tu le dis et tu devrais avoir des trucs a m'apprendre (ce que tu 'as pas fait jusqu'a present)soit tu devrauis peut-etre faire preuve d'un peu plus de modestie et prendre au serieux les idees de ceux que tu qualifie de "newbie".


---------------
Amaury.
n°734716
nraynaud
lol
Posté le 22-05-2004 à 15:11:45  profilanswer
 

amauryxiv a écrit :

tu devrais avoir des trucs a m'apprendre (ce que tu 'as pas fait jusqu'a present)


 

nraynaud a écrit :

J'ai trouvé le bug [:itm]
 
 
un article qui parle de "LA REGLE" :
http://java.sun.com/products/jfc/t [...] eads3.html
 
le tuto swing/threads :
http://java.sun.com/docs/books/tut [...] reads.html


(tu n'as manifestement rien compris à ça, ton post suivant le prouvant)
 
 

nraynaud a écrit :

non, pas en swing.
 
Je suis le seul du forum à savoir comment on doit utiliser les composants swing ou quoi ?
 
on leur envoie des évènements, depuis le modèle, si le coposant décide que ça change la tronche du composant, il repeint, sinon, il repeint pas.
 
 
faire un setBidule() sur un composant, vous pouvez vérifier, ça créé un évènement de changement du paramètre. Le handler d'évènements se démerde avec la peinture et le layout.


(tu es resté sur ton idée à la con)
 
 

amauryxiv a écrit :

Ba h peu importe c'est pas important et c'est pas ca qui fait foirer le truc ........


(tu es incapable de trouver le bug, mais tu sais déjà où il n'est pas, tu appelles paint() de 2 taches différentes, tu a un bug, et tu prétends que le pb ne *peut pas* venir de là)
 
 
 
 
C'est pourquoi il ne reste qu'une seule attitude possible : t'envoyer te faire foutre.
 
 
edit : être un noob, ça n'a rien de mal, quand je prends mon petit tuto pour installer tomcat, je suis un noob de la chose. Par contre, j'envoie pas chier les gens quand j'ai un pb avec tomcat.


Message édité par nraynaud le 22-05-2004 à 15:13:29

---------------
trainoo.com, c'est fini
n°734717
Jubijub
Parce que je le VD bien
Posté le 22-05-2004 à 15:12:29  profilanswer
 

je serais toi je titillerai pas nraynaud là dessus : c une grosse brute en java...en plus si tu le titille trop il risque de te ramener les furieux de blabla@prog et ca va te pourrir ton topic...
 
Il répond toujours sur un ton bourru mais il est comme ça, il est pas méchant en fait...
--> l'anglais de la javadoc est d'une simplicité déconcertante...faut vraiment te mettre à l'anglais, parce que programmer en java sans comprendre la javadoc, c comme piloter un avion qui fonce sur une falaise sans avoir le mode d'emploi du manche à balai...
 
Si toutefois la javadoc t'effraie à ce point, je me permet de te recommander Java in a Nutshell aux éditions O'reilly, qui malgré son titre se trouve en français (la nouvelle version a une couverture écrite en rouge)...en gros c une bible de java, qui explique pendant 200 pages les fonctionnements du langage, puis ensuite pendant les 1000 pages restante, te présente les classes un peu comme la javadoc...en général les gens l'aiment moyen vu que c une repompe de la javadoc, mais bon...


---------------
Jubi Photos : Flickr - 500px
n°734759
amauryxiv
Posté le 22-05-2004 à 17:14:18  profilanswer
 

Pas la peine de t'ennerver a ce point.
 
Je suis tout a fait d'accord pour dire que le probleme est lie au fait que j'appelle paint de deux thread differents. J'ai jamais dit le contraire. Seulement c'est pas ca que tu m'as reprocher dans tes precedents posts.
 
J'ai bien essye de lire "la regle". Seulement comme je l'ai deja dit, j'ai beaucoup de mal avec l'anglais, aussi simple qu'il soit.
 
Puisque visiblement t'as l'air de bien connaitre tu pourrais faire quelques suggestions !
 
Je sais bien qu'apres avoir mosifie un modele il faut le signaler pour que la vue soit mise a jour. Seulement avec le fonctionnement de swing, qui met a jour la vue dans un autre thread que celui qui modifie le modele, la mise a jour de la vue prends du retart sur les modifications du modele (qui dans mon programme sont extremement frequentes, puisqu'elles correspondent au mouvements de mes personnages).
 
Alors qu'est ce que je dois faire ? Utiliser InvokeAndWait() ? Qqchose du genre ?
 
P.S. : avant d'envoyer les gens se faire foutre, assure toi qu'il n'y a pas eu de quiproquo ou de malentendu.


---------------
Amaury.
n°734763
amauryxiv
Posté le 22-05-2004 à 17:20:10  profilanswer
 

Jubijub a écrit :

je serais toi je titillerai pas nraynaud là dessus : c une grosse brute en java...en plus si tu le titille trop il risque de te ramener les furieux de blabla@prog et ca va te pourrir ton topic...
 
Il répond toujours sur un ton bourru mais il est comme ça, il est pas méchant en fait...
--> l'anglais de la javadoc est d'une simplicité déconcertante...faut vraiment te mettre à l'anglais, parce que programmer en java sans comprendre la javadoc, c comme piloter un avion qui fonce sur une falaise sans avoir le mode d'emploi du manche à balai...
 
Si toutefois la javadoc t'effraie à ce point, je me permet de te recommander Java in a Nutshell aux éditions O'reilly, qui malgré son titre se trouve en français (la nouvelle version a une couverture écrite en rouge)...en gros c une bible de java, qui explique pendant 200 pages les fonctionnements du langage, puis ensuite pendant les 1000 pages restante, te présente les classes un peu comme la javadoc...en général les gens l'aiment moyen vu que c une repompe de la javadoc, mais bon...


 
Je te remercie de tes bons conseils. Je veux bien croire que nraynaud soit tres fort en java, mais quand meme, ca autorise pas tout. Moi quand je reponds a des questions, j'essaie de donner des suggestios sur ce que l'on peut faire. Je renvoie pas simplement a une doc.
Et je permets de dire a personne que sa question est ininterressante.
 
Enfin bref passons ...


---------------
Amaury.
n°734854
nraynaud
lol
Posté le 22-05-2004 à 20:33:17  profilanswer
 

amauryxiv a écrit :


P.S. : avant d'envoyer les gens se faire foutre, assure toi qu'il n'y a pas eu de quiproquo ou de malentendu.

j'ai fait 3 tentatives quand même.
 
 
Bon maintenant qu'on est sur des bonnes bases, on va voir.
 
 
Les "modèles" de swing doivent vivre au rythme de swing, donc n'être modifiés que dans le thread de répartition des évènements swing (listeners de souris par exemple) ou dans le cadre d'un invokeLater() ou dans le cadre d'un invokeAndWait().
Ceci pour une raison simple : le modèle va être lu pour faire de la peinture, hors il faut que les données ne se modifient pas pendant tout le temps de peinture. Par exemple, valider une JList consiste (schématiquement) à lire la longueur de la liste, calculer avec le renderer la taille du rectangle que ça représente, regarder si ça change le layout, si oui, refaire tout le layout. Si entre le moment où j'ai calculé le nouveau layout et le moment où je vais peindre chaque case, le nombre d'éléments a changé, je vais dans le mur.
 
On va donc communiquer avec le thread de répartition des évènements swing par une file de messages, et c'est ce thread-là qui fera les modifications à un moment où ça ne mettra pas la zone dans le système.
 
Pour ça, il y a plusieurs méthodes :
- envoyer un évènement swing (enfin awt, la package a été rétrofité). Je sais pas comment on fait, et java.sun.com semble en vrac chez moi.
- utiliser SwingUtilities.invokeLater(), qui consiste à insérer un Runnable dans la file, il sera exécuté une seule fois à un moment où il n'y a aucun risque
- utiliser SwingUtilities.invokeAndWait(), qui va insérer un Runnable dans la file, mais bloquer le thread appelant jusqu'à la fin de l'exécution de run() du runnable passé en paramètre.
 
 
A noter une exception notable au principe de du thread unique : les méthodes de modification du texte dans les JTextComponent (en réalité, c'est AbstractDocument qui implémente un locking) peuvent être appellées depuis n'importe quel thread. Si c'est vrai !
 
 
Dans ton cas, mon conseil est bien entendu de créer ton propre composant, qui aura son propre modèle associé. Le modèle variera à intervalles réguliers en fonction de l'horloge, et préviendra le composant en face.  
Le rattrapage se fera avec invokeLater ou invokeAndWait au niveau de la notification du composant, je sais pas trop lequel est le plus indiqué dans ce cas. Peut-être qu'en testant un des 2 sera pire que l'autre.


---------------
trainoo.com, c'est fini
n°734895
amauryxiv
Posté le 22-05-2004 à 21:26:55  profilanswer
 

Mouais pas tres clair pour moi tout ca.
 
Pour l'instant j'ai mis tous mes appels à paintImmediatly() dans des invokeAndWait(). Comme ca ils sont bien executes par l'event dispatch thread.
Ca resoud le petit bug dans l'affichage du score (ou des personnages apparaissaient en haut a gauche).
Par contre, quand pour les éléments du tableau (les fruits) je mets des gifs animes, alors la tout part en couille. Des interferences reappariassent et le jeu s'arrete brutalement au bout de quelques secondes.
 
Donc dans l'etat actuel des choses, chaque timer modifie mon modele et appelle un invokeLater() pour repeindre, et ces deux choses sont faites l'une apres l'autre dans le meme thread. De plus, deux personnages ne peuvent pas etre repeints en meme temps.
 
Je suppose, que c'est pas encore ce qu'il faut puisque je peux pas mettre de gifs animes. Je posterai bientot le code qui sert au dessin.


---------------
Amaury.
n°734898
nraynaud
lol
Posté le 22-05-2004 à 21:35:00  profilanswer
 

donne tout, parce que sans eclipse pour naviguer dans le, c'est la galère.


---------------
trainoo.com, c'est fini
n°734907
amauryxiv
Posté le 22-05-2004 à 22:19:31  profilanswer
 

Ma classe principale:

Code :
  1. package pacman.applets;
  2. import java.awt.*;
  3. import java.awt.event.*;
  4. import javax.swing.*;
  5. import pacman.tableau.*;
  6. import java.io.*;
  7. import pacman.timers.*;
  8. import pacman.graphics.*;
  9. import java.util.Enumeration;
  10. import java.net.URL;
  11. import javax.sound.sampled.*;
  12. import pacman.son.*;
  13. /**
  14. * <p>Title: Site personnel</p>
  15. * <p>Description: Site internet</p>
  16. * <p>Copyright: Copyright (c) 2002</p>
  17. * <p>Company: none</p>
  18. * @author Amaury de Boussineau
  19. * @version 1.0
  20. */
  21. public class FramePacman extends JFrame {
  22.   protected Tableau tableau;
  23.   protected Rectangle surfaceARepeindre = new Rectangle(0, 0, 0, 0);
  24.   protected boolean repeintPersonnage = false;
  25.  
  26.   protected final PanelTableau panelJeu = new PanelTableau();
  27.   protected final PanelScore panelScore = new PanelScore();
  28.  
  29.   public int pointsJoueur, bonus, score;
  30.   public FramePacman() throws Exception {
  31.     super("Pacman" );
  32.     this.commencerPartie();
  33.     try {
  34.         this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  35.     }
  36.     catch(Exception e) {
  37.         this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
  38.     }
  39.     this.setResizable(false);
  40.     this.getContentPane().setLayout(new BoxLayout(this.getContentPane(), BoxLayout.X_AXIS));
  41.     this.getContentPane().add(panelJeu);
  42.     this.getContentPane().add(panelScore);
  43.     this.pack();
  44.     this.setVisible(true);
  45.    
  46.     this.commencerTableau();
  47.   }
  48.   /**A PARTIR DE LA SE TROUVENT TOUTES LES METHODES ET CLASSES GRAPHIQUES QUE J'UTILISE
  49.    */
  50.   public synchronized void repeindre(Drawable element) {
  51.     this.repeintPersonnage = true;
  52.     this.surfaceARepeindre = element.surface(this.panelJeu);
  53.     try {
  54.         SwingUtilities.invokeAndWait(new Runnable() {
  55.             public void run() {
  56.                 panelJeu.paintImmediately(FramePacman.this.surfaceARepeindre);
  57.             }
  58.         });
  59.     }
  60.     catch(Exception e) {
  61.         e.printStackTrace();
  62.     }
  63.     this.repeintPersonnage = false;
  64.   }
  65.  
  66.   public synchronized void paint(Graphics g) {
  67.       super.paint(g);
  68.   }
  69.   public void actualiserScore() {
  70.       this.panelScore.repaint();
  71.   }
  72.  
  73.   private class PanelTableau extends JPanel {
  74.     public PanelTableau() {
  75.       super();
  76.       this.setBackground(Color.BLACK);
  77.       this.setPreferredSize(new Dimension(780, 780));
  78.       this.addKeyListener(new DirectionListener());
  79.       this.setFocusable(true);
  80.       this.requestFocus();
  81.     }
  82.     public void paintComponent(Graphics g) {
  83.         if(FramePacman.this.repeintPersonnage) {
  84.             Rectangle r = FramePacman.this.surfaceARepeindre;
  85.             if(r != null) {
  86.                 g.setClip(r);
  87.                 g.setColor(Color.BLACK);
  88.                 g.fillRect(r.x, r.y, r.width, r.height);
  89.                 FramePacman.this.tableau.redraw(g, this);
  90.             }
  91.         }
  92.         else {
  93.           super.paintComponent(g);
  94.           FramePacman.this.tableau.draw(g, this);
  95.         }
  96.     }
  97.   }
  98.  
  99.  
  100.  
  101.   private class PanelScore extends JPanel {
  102.       public PanelScore() {
  103.           this.setPreferredSize(new Dimension(300, 780));
  104.           this.setBackground(Color.BLACK);
  105.       }
  106.      
  107.       public void paintComponent(Graphics g) {
  108.           super.paintComponent(g);
  109.           Font font = new Font("TeleText", Font.BOLD, 60);
  110.           g.setFont(font);
  111.           g.setColor(Color.CYAN);
  112.           g.drawRoundRect(5, 5, 290, 230, 20, 20);
  113.           g.drawRoundRect(6, 6, 288, 228, 20, 20);
  114.           g.drawRoundRect(7, 7, 286, 226, 20, 20);
  115.           g.drawString("Points:", 10, 100);
  116.           g.setColor(Color.BLUE);
  117.           g.drawRoundRect(5, 255, 290, 230, 20, 20);
  118.           g.drawRoundRect(6, 256, 288, 228, 20, 20);
  119.           g.drawRoundRect(7, 257, 286, 226, 20, 20);
  120.           g.drawString("Bonus:", 10, 350);
  121.           g.setColor(Color.RED);
  122.           g.drawRoundRect(5, 505, 290, 230, 20, 20);
  123.           g.drawRoundRect(6, 506, 288, 228, 20, 20);
  124.           g.drawRoundRect(7, 507, 286, 226, 20, 20);
  125.           g.drawString("Score:", 10, 600);
  126.           g.setColor(Color.BLUE);
  127.           g.drawString(String.valueOf(FramePacman.this.bonus), 10, 450);
  128.           g.setColor(Color.CYAN);
  129.           g.drawString(String.valueOf(FramePacman.this.pointsJoueur), 10, 200);
  130.           g.setColor(Color.RED);
  131.           g.drawString(String.valueOf(FramePacman.this.bonus + FramePacman.this.pointsJoueur), 10, 700);
  132.       }
  133.          
  134.   }
  135. }


 
La classe Tableau:

Code :
  1. package pacman.tableau;
  2. import pacman.tableau.exceptions.*;
  3. import pacman.graphes.*;
  4. import java.awt.*;
  5. import java.awt.image.ImageObserver;
  6. import pacman.applets.FramePacman;
  7. import pacman.signaux.FinTableau;
  8. import pacman.graphics.Drawable;
  9. import java.util.*;
  10. import pacman.timers.*;
  11. /**
  12. * <p>Title: Site personnel</p>
  13. * <p>Description: Site internet</p>
  14. * <p>Copyright: Copyright (c) 2002</p>
  15. * <p>Company: none</p>
  16. * @author Amaury de Boussineau
  17. * @version 1.0
  18. */
  19. public class Tableau {
  20.   protected FramePacman container;
  21.   public void draw(Graphics g, ImageObserver o) {
  22.     for(int i=0; i<emplacements.length; i++) {
  23.       for(int j=0; j<emplacements[0].length; j++) {
  24.         this.emplacements[i][j].draw(g, o);
  25.       }
  26.     }
  27.     this.pacman.draw(g, o);
  28.     for(Enumeration e = this.fantomes.elements(); e.hasMoreElements();) {
  29.       ((pacman.pacman.Fantome) e.nextElement()).draw(g, o);
  30.     }
  31.   }
  32.   public void redraw(Graphics g, ImageObserver o) {
  33.     this.pacman.redraw(g, o);
  34.     for(Enumeration e = this.fantomes.elements(); e.hasMoreElements();) {
  35.       ((pacman.pacman.Fantome) e.nextElement()).redraw(g, o);
  36.     }
  37.     for(Enumeration e = this.portes.elements(); e.hasMoreElements();) {
  38.       ((Emplacement) e.nextElement()).redraw(g, o);
  39.     }
  40.   }
  41.   public void repeindre(Drawable element) {
  42.     this.container.repeindre(element);
  43.   }
  44. }


 
La classe Drawable, dont heritent tous les elements du tableau:

Code :
  1. package pacman.graphics;
  2. import java.awt.*;
  3. import java.awt.image.ImageObserver;
  4. import pacman.tableau.Tableau;
  5. /**
  6. * <p>Title: Site personnel</p>
  7. * <p>Description: Site internet</p>
  8. * <p>Copyright: Copyright (c) 2002</p>
  9. * <p>Company: none</p>
  10. * @author Amaury de Boussineau
  11. * @version 1.0
  12. */
  13. public abstract class Drawable {
  14.   protected Tableau tableau;
  15.   protected Pixel pixel;
  16.   protected Image image;
  17.   public Drawable(Tableau tableau) {
  18.     this.tableau = tableau;
  19.   }
  20.   public abstract void calculeImage();
  21.   public Tableau tableau() {
  22.     return this.tableau;
  23.   }
  24.   public void setImage(Image i) {
  25.     this.image = i;
  26.   }
  27.   public Image getImage() {
  28.     return this.image;
  29.   }
  30.   public void setPixel(Pixel p) {
  31.     this.pixel = p;
  32.   }
  33.   public Pixel getPixel() {
  34.     return this.pixel;
  35.   }
  36.   public Rectangle surface(ImageObserver o) {
  37.     if(this.image == null) return new Rectangle(pixel.x() - 20/2 - 5, pixel.y() - 20/2 - 5, 20 + 10, 20 + 10);
  38.     return new Rectangle(pixel.x() - image.getWidth(o)/2 - 5, pixel.y() - image.getHeight(o)/2 - 5, image.getWidth(o) + 10, image.getHeight(o) + 10);
  39.   }
  40.   public void repeindre() {
  41.     this.tableau.repeindre(this);
  42.   }
  43.   public void draw(Graphics g, ImageObserver o) {
  44.     if(image == null) return;
  45.     int x = pixel.x() - image.getWidth(o)/2;
  46.     int y = pixel.y() - image.getHeight(o)/2;
  47.     g.drawImage(image, x, y, o);
  48.   }
  49.   public void redraw(Graphics g, ImageObserver o) {
  50.     this.draw(g, o);
  51.   }
  52. }


 
La classe Personnage dont heritent Pacman et Fantome:

Code :
  1. package pacman.pacman;
  2. import pacman.graphics.Drawable;
  3. import pacman.tableau.*;
  4. import pacman.tableau.exceptions.*;
  5. import java.awt.Graphics;
  6. import java.awt.image.ImageObserver;
  7. import java.util.Vector;
  8. import java.util.Enumeration;
  9. /**
  10. * <p>Title: Site personnel</p>
  11. * <p>Description: Site internet</p>
  12. * <p>Copyright: Copyright (c) 2002</p>
  13. * <p>Company: none</p>
  14. * @author Amaury de Boussineau
  15. * @version 1.0
  16. */
  17. public abstract class Personnage extends Drawable {
  18.   public synchronized void redraw(Graphics g, ImageObserver o) {
  19.     Vector v = this.ancienPoint.emplacementsConnexes();
  20.     v.addAll(this.pointDirection.emplacementsConnexes());
  21.     for(Enumeration e = v.elements(); e.hasMoreElements();) {
  22.       ((Drawable) e.nextElement()).draw(g, o);
  23.     }
  24.     this.draw(g, o);
  25.   }
  26. }


 
Voila. Je crois qu'il y a l'ssentiel de ce qu'il faut. Le methode move() de chaque personnage est declenchee par un timer et modifie l'emplacement ou doit etre dessine le personnage (variable pixel dans la classe Drawable), puis decleche le redessin en appelant repeindre().


Message édité par amauryxiv le 22-05-2004 à 22:23:07

---------------
Amaury.
n°734938
nraynaud
lol
Posté le 22-05-2004 à 23:26:17  profilanswer
 

je capte pas le rôle de surfaceARepeindre.
 
j'ai comme l'impression que tu n'as pas tout donné.
 
pourquoi faire de la peinture sur des JPanels au lieu de faire ton propre JComponent ?  
 
Il faudrait mettre ses minimumSize, maximumSize et preferedSize à la même valeur, pour bloquer tout.
 
tu peux m'envoyer une copie d'écran des défaut par mail (hfr@nraynaud.com) ? je posterai la chose ici en l'hébergeant chez moi. Mais ça aiderait probablement pour y voir clair sur ce bug. As-tu la garantie que le score n'est pas modifié pendant la peinture ?
 
Tu as parlé de timers, je les vois pas.
 
la doc dit que paint() c'est mieux que paintImmediately(), qu'est-ce qui rend obligatoire cette dernière ? et pourquoi pas plutôt repaint(), puisqu'il est précisé qu'on ne doit pas utiliser paint() dans la javadoc.
 
 
 
edit : bordel de touchpad.


Message édité par nraynaud le 22-05-2004 à 23:26:47

---------------
trainoo.com, c'est fini
n°734942
nraynaud
lol
Posté le 22-05-2004 à 23:32:08  profilanswer
 

on verra après pour les gifs annimés, mais on va procéder par étape.


---------------
trainoo.com, c'est fini
n°734949
amauryxiv
Posté le 22-05-2004 à 23:36:36  profilanswer
 

- surfaceARepeindre je pourrais m'en passer. Ca sert seulement a connaitre le petit rectangle qu'il y a a rafrachir. Donc ca evite d'appeler super.paintComponent() sur mon PanelTableau, qui repeint tout le fond en noir, ce qui prend du temps.
 
- Ben Jpanel ou JComponent je sais pas si ca change grand chose. En tout cas je vois pas ce qu'on perd en prenant un JPanel.
 
- Les timers je les ai pas mis, c'est sans interet. C'est tous des timers de type java.util.Timer.
 
- J'appelle paintImmediatly a la place de paint parce que ca m'evite d'avoir a generer l'objet Graphics. Et j'utilise pas repaint() parce que repaint utilise invokeLater() et la peinture se fait alors trop tard.
 
- pour les copies d'ecran je vais essayer.


---------------
Amaury.
n°734958
nraynaud
lol
Posté le 22-05-2004 à 23:46:48  profilanswer
 

fait péter les timertask (et ce qui va avec pour les comprendre) quand même stp.
 
Je suis *très* perplexe par rapport à repaint(), voire même je subodore un candidat au bug graphique, il faudrait vérifier par rapport aux trains d'évènements, mais j'en ai pas les moyens. Tu as le bug d'affichage avec repaint() ?


---------------
trainoo.com, c'est fini
n°734965
amauryxiv
Posté le 22-05-2004 à 23:51:30  profilanswer
 

- Voila les timers:

Code :
  1. package pacman.timers;
  2. import java.util.*;
  3. /**
  4. * <p>Title: Site personnel</p>
  5. * <p>Description: Site internet</p>
  6. * <p>Copyright: Copyright (c) 2002</p>
  7. * <p>Company: none</p>
  8. * @author Amaury de Boussineau
  9. * @version 1.0
  10. */
  11. public abstract class MyTimers extends Timer {
  12.   public static Vector timers = new Vector();
  13.   protected float vitesse;
  14.   protected float vitesse() {
  15.     return this.vitesse;
  16.   }
  17.   public MyTimers() {
  18.     super(true);
  19.     MyTimers.timers.add(this);
  20.     this.vitesse = 0;
  21.   }
  22.   public MyTimers(float vitesse) {
  23.     super(true);
  24.     MyTimers.timers.add(this);
  25.     this.vitesse = vitesse;
  26.   }
  27.   public abstract void action();
  28.   public void schedule(boolean attente) throws ArithmeticException {
  29.     TimerTask timerTask = new TimerTask() {
  30.       public void run() {
  31.         MyTimers.this.action();
  32.       }
  33.     };
  34.     long delay = (long) (1000/this.vitesse());
  35.     if(! attente) this.scheduleAtFixedRate(timerTask, 0, delay);
  36.     else this.scheduleAtFixedRate(timerTask, /*(long) (1000/this.vitesse())*/ 10000, delay);
  37.   }
  38. }
  39. // Timer pour pacman.
  40. package pacman.timers;
  41. import pacman.pacman.Pacman;
  42. import java.util.*;
  43. /**
  44. * <p>Title: Site personnel</p>
  45. * <p>Description: Site internet</p>
  46. * <p>Copyright: Copyright (c) 2002</p>
  47. * <p>Company: none</p>
  48. * @author Amaury de Boussineau
  49. * @version 1.0
  50. */
  51. public class TimerPacman extends MyTimers {
  52.   protected Pacman pacman;
  53.   public TimerPacman(Pacman pacman) {
  54.     super(Pacman.vitesse);
  55.     this.pacman = pacman;
  56.   }
  57.   public void action() {
  58.     this.pacman.move();
  59.   }
  60. }
  61. //Pour les fantomes:
  62. package pacman.timers;
  63. import pacman.pacman.*;
  64. /**
  65. * <p>Title: Site personnel</p>
  66. * <p>Description: Site internet</p>
  67. * <p>Copyright: Copyright (c) 2002</p>
  68. * <p>Company: none</p>
  69. * @author Amaury de Boussineau
  70. * @version 1.0
  71. */
  72. public class TimerFantome extends MyTimers {
  73.   protected Fantome fantome;
  74.   public TimerFantome(Fantome fantome) {
  75.     super(Pacman.vitesse/1.2f);
  76.     this.fantome = fantome;
  77.   }
  78.   public void action() {
  79.     this.fantome.move();
  80.   }
  81. }


 
 
- Pour repaint: quand j'utilise repaint(), c'est un autre bug qui apparait. Quand j'utilise repaint(), les timers bougent les personnages pendant la peinture et ca laisse place a pas mal de bug, surout sur des machines pas puissantes.


---------------
Amaury.
n°734968
nraynaud
lol
Posté le 22-05-2004 à 23:56:08  profilanswer
 

concernant les timer > c'est la cata.
 
 
repaint > ça c'est un problème dans ta conception, c'est exactement ce dont je parlais dans mon paté au-dessus, ton modèle swing est modifié pendant la peinture. c'est à ça qu'il faut que tu t'attaques.


---------------
trainoo.com, c'est fini
n°734972
amauryxiv
Posté le 22-05-2004 à 23:59:17  profilanswer
 

nraynaud a écrit :

concernant les timer > c'est la cata.


 
- Qu'est ce qu'y zont mes timers ? Ya rien de plus simple !
 
- mon modele est modifie pendant la peinture si j'appelle repaint, mais pas dans l'etat actuel de mon code.


---------------
Amaury.
n°734978
nraynaud
lol
Posté le 23-05-2004 à 00:06:16  profilanswer
 

si j'ai bien compris, ton code ne fonctionne pas dans l'état actuel non plus, on en serait pas là sinon.
 
Sauf que dans l'état actuel, y'a personne pour t'aider car il n'y a aucune doc sur l'utilisation de paint() n'importe où.
 
Sachant que tu peux avoir des problèmes de lenteur (ça arrive en temps réel) on peut régler les pb d'optimisation.


---------------
trainoo.com, c'est fini
n°734980
amauryxiv
Posté le 23-05-2004 à 00:08:34  profilanswer
 

Ben y fonctionne qu'en partie. Y merde que quand je mets des gifs animes pour les fruits. Tant que c'est des images statiques tout marche.
 
Sur ce je m'en tiendrai la pour ce soir: il se fait tard.
 
Merci de ton aide, et bonne nuit !


Message édité par amauryxiv le 23-05-2004 à 00:09:26

---------------
Amaury.
n°734993
nraynaud
lol
Posté le 23-05-2004 à 00:47:58  profilanswer
 

concernant les Timers :
 
on ne créé qu'un seul timer pour toute l'application et on lui fait exécuter tous les TimerTasks qu'on veut, mais on ne créé pas des dizaines de Timers, ça bouffe une tonne de ressources. D'autre part, les Timers utilisent en interne un algo de ouf (un tas binaire) pour pouvoir, justement, gérer un très grand nombre de taches.


---------------
trainoo.com, c'est fini
n°735106
amauryxiv
Posté le 23-05-2004 à 12:42:14  profilanswer
 

Ouais mais alors avec un seil Timer, comment tu effectue plusieurs tache a des frzequences differentes ???


---------------
Amaury.
n°735114
nraynaud
lol
Posté le 23-05-2004 à 13:12:23  profilanswer
 

Code :
  1. Timer monTimer = new Timer();
  2. monTimer.schedule(task1, 10000);
  3. monTimer.schedule(task2, 100000, 20000);
  4. monTimer.scheduleAtFixedRate(task3, 10000, 403900);


 
 
pas de problème.


---------------
trainoo.com, c'est fini
n°735159
amauryxiv
Posté le 23-05-2004 à 15:45:23  profilanswer
 

Ouais mais a ce moment la tu peux plus arreter qu'une seule tache. C'est toutes ou rien.
 
Bref je pourrais economiser quelques Timers, c'est vrai, mais c'est pas ca qui fait merder mon programme ....


---------------
Amaury.
n°735160
nraynaud
lol
Posté le 23-05-2004 à 15:49:37  profilanswer
 

amauryxiv a écrit :

Ouais mais a ce moment la tu peux plus arreter qu'une seule tache. C'est toutes ou rien.
 
Bref je pourrais economiser quelques Timers, c'est vrai, mais c'est pas ca qui fait merder mon programme ....


http://java.sun.com/j2se/1.4.2/doc [...] l#cancel()
 
 
bon, je commence à croire que j'avais eu raison de t'envoyer chier, je ne sais combien de pavés pour en arriver à "c'est pas ça qui fait merder mon programme" alors que je t'ai montré une erreur majeure dedans.


---------------
trainoo.com, c'est fini
n°735164
amauryxiv
Posté le 23-05-2004 à 16:06:33  profilanswer
 

Ben je suis navre, mais si je concoit que ma facon de faire avec les timers soit tres loin de qqchose d'optimisé, moi je vois pas de rapport avec des problemes qui concernent swing; et si y en a un t'as qu'a l'expliquer, au moins ca sera clair.
 
Maintenant si ca te saoule de me repondre t'es pas oblige. Je pase volontier qu'on m'envoie chier.


---------------
Amaury.
n°735172
nraynaud
lol
Posté le 23-05-2004 à 16:16:05  profilanswer
 

amauryxiv a écrit :

Ben je suis navre, mais si je concoit que ma facon de faire avec les timers soit tres loin de qqchose d'optimisé, moi je vois pas de rapport avec des problemes qui concernent swing; et si y en a un t'as qu'a l'expliquer, au moins ca sera clair.
 
Maintenant si ca te saoule de me repondre t'es pas oblige. Je pase volontier qu'on m'envoie chier.

Je parle de repaint() .
 
 
Le problème c'est les gros nazes qui font du java, y'en a partout et après j'entends tout le temps "java sapu c'est lent et ça bugge" alors je tente d'éduquer un peu les gens à faire du java correct. D'autant plus que ne pas savoir lire le manuel n'est pas un frein professionnellement, et avec l'accélération de l'informatisation de la vie quotidienne, j'aimerais bien qu'un de ces gros nazes ne me tue pas par ses bugs à la con et sa désinvolture.


---------------
trainoo.com, c'est fini
n°735306
amauryxiv
Posté le 23-05-2004 à 20:05:07  profilanswer
 

Ecoute mon pote ché pas si t'as vu la gueule de mon programme, mais je le fais pour m'amuser moi. Chuis pas au boulot tu vois.
 
Alors si ta seule intention c'est de me prendre sur ce ton la tu peux te casser, je me passerai de toi.
 
Moi les je-sais-tout je m'en fous. Et si tu veux pas que je te dise des trucs que tu trouves cons t'as qu'a etre clair dans tes reponses.
 
Maintenant tu peux te casser, je t'ai assez entendu. Et compte pas sur moi pour "m'eduquer an java" en ecoutant un con dans ton genre.


---------------
Amaury.
n°735341
nraynaud
lol
Posté le 23-05-2004 à 21:06:00  profilanswer
 

amauryxiv a écrit :

Ecoute mon pote ché pas si t'as vu la gueule de mon programme, mais je le fais pour m'amuser moi. Chuis pas au boulot tu vois.
 
Alors si ta seule intention c'est de me prendre sur ce ton la tu peux te casser, je me passerai de toi.
 
Moi les je-sais-tout je m'en fous. Et si tu veux pas que je te dise des trucs que tu trouves cons t'as qu'a etre clair dans tes reponses.
 
Maintenant tu peux te casser, je t'ai assez entendu. Et compte pas sur moi pour "m'eduquer an java" en ecoutant un con dans ton genre.

on m'y reprendra à pas envoyer chier le boulets tiens !


---------------
trainoo.com, c'est fini
n°735388
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 23-05-2004 à 21:37:39  profilanswer
 

amauryxiv a écrit :

Ecoute mon pote ché pas si t'as vu la gueule de mon programme, mais je le fais pour m'amuser moi. Chuis pas au boulot tu vois.
 
Alors si ta seule intention c'est de me prendre sur ce ton la tu peux te casser, je me passerai de toi.
 
Moi les je-sais-tout je m'en fous. Et si tu veux pas que je te dise des trucs que tu trouves cons t'as qu'a etre clair dans tes reponses.
 
Maintenant tu peux te casser, je t'ai assez entendu. Et compte pas sur moi pour "m'eduquer an java" en ecoutant un con dans ton genre.


nraynaud reste ici ! toi par contre, t'auras tout le temps de lire les règles du forum !
[:jpa]


---------------
J'ai un string dans l'array (Paris Hilton)
n°735470
the real m​oins moins
Posté le 23-05-2004 à 23:40:51  profilanswer
 

c pâs trop tot :jap:


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  Swing et le double-buffering.

 

Sujets relatifs
Swing, afficher une image en fond de jpanel (code inside)[Swing][JprogressBar]Problémé d'affichage de Mon JprogressBar
Dessin et rafraichissement sous swingDouble lien sur iframe
Rafraichissemnt et SwingSwing et le refraichissement.
[XML - MathML - Java] Interpréter du MathML dans du Java (SWING)[java] swing : comment réaliser un arbre binaire
Bug ie double margin avec les float[shell] le double $
Plus de sujets relatifs à : Swing et le double-buffering.


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR