Partage
  • Partager sur Facebook
  • Partager sur Twitter

Afficher plusieurs objets Graphics

setContentPane

Sujet résolu
    2 juin 2009 à 0:48:50

    Bonsoir les zeros

    Je suis entrain d'essayer de faire un petit jeu en java ou l'on dirige un vaisseau et ou il faut éviter des asteroides.
    Mais je rencontre un probleme, je n'arrive pas à afficher plusieurs objets Graphics en meme temps.
    L'image affiché est la dernière à être envoyé.

    J'ai une classe Vaisseau, une classe Asteroide et une autre Fenetre

    Voici une partie de la classe Fenetre :

    public class Fenetre extends JFrame {
    	private Vaisseau vaisseau = new Vaisseau(80, 62);
            private List lesAsteroides = new ArrayList(80);
            private int largeur = 700;
            private int hauteur = 800;
    
            
            public Fenetre(){
            	
                this.setSize(largeur, hauteur);
                this.getContentPane().add(vaisseau);      
                this.setVisible(true);
                
                int y = 0;
                for(int i = 0; i< 4 ; i++){
    	            Random  randomGenerator = new Random();
    	    		int H = (randomGenerator.nextInt(10)+1)*10;
    	    		int L = (randomGenerator.nextInt(10)+1)*10;
    	    		Asteroide asteroide = new Asteroide(H, L);
    	    		double X = randomGenerator.nextDouble()*(largeur-asteroide.getL());
    	    		int x = (int)X;
    	    		y += 100;
    	    		asteroide.setPosY(y);
    	    		asteroide.setPosX(x);
    	    		lesAsteroides.add(asteroide); 
    	            this.getContentPane().add(asteroide); 
                }
            }    
    }
    



    Avec ce code j'ai mon vaisseau qui s'affiche correctement, et le dernier astéroide également, mais pas les autres :s
    Je pense que je n'utilise pas correctement this.getContentPane().add().
    Si quelqu'un pourront m'aider :D
    Merci.
    • Partager sur Facebook
    • Partager sur Twitter
      2 juin 2009 à 1:01:50

      Salut,

      Y'a un petit soucis dans tout ça.
      En fait on évite de dessiner sur le contentPane de la JFrame. On dessine plutôt sur un JPanel via paintComponent(Graphics).
      Et c'est là que c'est très bien car tu as juste à peindre toute ta liste d'astéroïdes et ton vaisseau sur le JPanel aux endroits que tu désires.

      Par ailleurs petite confusion, il n'y a qu'un seul objet Graphics délivré par le système. Un vaisseau n'est pas un objet Graphics. Pour faire très très simple, l'objet Graphics c'est ta feuille de dessin.

      Sinon j'ignore le Layout par défaut d'un contentPane() d'une JFrame, mais vaut mieux éviter de l'utiliser pour peindre des choses.

      En résumé : peins sur un JPanel que tu ajouteras à ta JFrame, c'est le plus raisonnable.
      • Partager sur Facebook
      • Partager sur Twitter
        2 juin 2009 à 1:51:26

        Le Layout par défaut d'une JFrame est un BorderLayout. En fait ça revient au même que de créer un JPanel, de lui mettre un BorderLayout et de faire un setContentPane.

        Sinon peindre sur le JPanel principal de la JFrame ça ne pose aucun problème. Sinon avis personnel, pour ceux que tu souhaites faire j'utiliserais plutôt un JLayeredPane...
        • Partager sur Facebook
        • Partager sur Twitter
          2 juin 2009 à 1:55:38

          Salut Elmh,
          En faite mes classe Asteroide et Vaisseau heritent de JPanel et contiennent cette methode :

          public void paintComponent(Graphics g){
                  try {
                           Image img = ImageIO.read(new File("image/vaisseau.png"));
                           g.setColor(Color.white);
                           g.drawImage(img, super.getPosX(), super.getPosY(), this);
                   } catch (IOException e) {
                           // TODO Auto-generated catch block
                           e.printStackTrace();
                   }
          	}
          


          Que j'ai repris du tuto sur Java.

          Es ce que tu pourrais me donner un petit exemple si tu as le temps ?

          Si j'ai bien compris, je declare un JPanel dans ma classe Fenetre, et j'ajoute mais element la. Mais comment ?

          J'ai essayé en copiant sur ce code :
          public class Fenetre extends JFrame {
           
              private Panneau pan = new Panneau();
              private Bouton bouton = new Bouton("mon bouton");
              private JPanel container = new JPanel();
              private JLabel label = new JLabel("Le JLabel");
             
              public Fenetre(){
                     
                      this.setTitle("Animation");
                      this.setSize(300, 300);
                      this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                      this.setLocationRelativeTo(null);
                     
                      container.setBackground(Color.white);
                      container.setLayout(new BorderLayout());
                      container.add(pan, BorderLayout.CENTER);
                      container.add(bouton, BorderLayout.SOUTH);
                      container.add(label, BorderLayout.NORTH);
                     
                      this.setContentPane(container);
                      this.setVisible(true);
                     
                      go();
              }
                  
              //...
          }
          

          C'est comme cela qu'il faut s'y prendre ?


          janulrich00001, merci, je ne connais pas les JLayeredPanel (je suis debutant :D) je vais jeter un eil.
          • Partager sur Facebook
          • Partager sur Twitter
            2 juin 2009 à 2:21:24

            Citation : janulrich00001

            Le Layout par défaut d'une JFrame est un BorderLayout. En fait ça revient au même que de créer un JPanel, de lui mettre un BorderLayout et de faire un setContentPane.

            Sinon peindre sur le JPanel principal de la JFrame ça ne pose aucun problème. Sinon avis personnel, pour ceux que tu souhaites faire j'utiliserais plutôt un JLayeredPane...


            Le Layout par défaut d'une JFrame est null. C'est le contentPane qui a un BorderLayout par défaut.
            Par ailleurs ce contentPane par défaut n'est pas un JPanel avec un BorderLayout mais un enfant de JComponent sans plus. Mais la différence doit être minime je te l'accorde.
            Enfin je ne vois pas ce que tu veux dire par JPanel principal d'une JFrame. Il faut le créer, tu dois parler de ça.
            Il n'y a en général pas besoin d'utiliser le LayeredPane de la JFrame. Mais bon je suis prêt à discuter là-dessus car ça a ses avantages.


            Quoique tu comptes faire Wackers, faire hériter un Vaisseau d'un JPanel est une aberration. Pourquoi ? Parce qu'un Vaisseau n'est pas un Container.
            Aussi voici une alternative propre et orientée objet :
            class Vaisseau {
               Image img = null;
               
               public Vaisseau() {
                  try {
                     img = ImageIO.read(new File("image/vaisseau.png"));
                  } catch(IOException ioe) {
                     ioe.printStackTrace();
                  }
               }
            
               public void seDessiner(Graphics2D g) {
                  g.setColor(Color.WHITE);
                  g.drawImage(img, posX, posY, this);
               }
            
            }
            


            De même pour tes astéroïdes.

            Ensuite il serait bien d'avoir une classe SurfaceJeu qui hérite de JPanel qui s'occupe de dessiner le jeu :
            class SurfaceJeu extends JPanel {
            
               @Override
               public void paintComponent(Graphics g2) {
                  super.paintComponent(g2);
                  Graphics2D g = (Graphics2D)g2;
                  vaisseau.seDessiner(g);
                  int i = 0;
                  while(i < lesAsteroides.size()) {
                     (Asteroide)(lesAsteroides.get(i)).seDessiner(g);
                     i++;
                  }
               }
            
            }
            


            Je ne suis pas trop sûr de la syntaxe de l'ArrayList mais ça doit ressembler à ça.
            Enfin il suffit d'ajouter ce JPanel à la JFrame simplement :
            class SpaceInvaders extends JFrame {
               JPanel surfaceJeu = null;   
            
               public SpaceInvaders() {
                  super("Mon jeu de Space Invaders !");
                  surfaceJeu = new SurfaceJeu();
                  surfaceJeu.setPreferredSize(new Dimension(700, 700));
                  add(surfaceJeu);
                  pack();
            
                  setDefaultCloseOperation(EXIT_ON_CLOSE);
                  setVisible(true);
               }
            
            }
            


            Bien sûr ce n'est qu'une démarche possible parmi d'autres, mais que je recommande vivement car elle est intuitive et simple.
            • Partager sur Facebook
            • Partager sur Twitter
              2 juin 2009 à 2:37:45

              Ok, merci beaucoup, je modifirais mon code demain, mais j'y vois maintenant plus claire :)

              edit : Bon finalement j'ai modifié mon code maintenant, et tout marche parfaitement :p. Et la je suis complètement KO.
              Encore merci :D
              • Partager sur Facebook
              • Partager sur Twitter

              Afficher plusieurs objets Graphics

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown