Partage
  • Partager sur Facebook
  • Partager sur Twitter

Plusieurs rectangles qui se déplacent...

Impossible à afficher correctement

    22 décembre 2009 à 22:59:29

    Bonsoir,

    J'essaie d'écrire un mini-jeu où des rectangles se déplacent à l'intérieur d'une fenêtre en rebondissant sur les murs.
    L'objectif est de déplacer un "rectangle joueur" afin qu'il ne touche pas les autres rectangles...

    J'ai créé un objet rectangle. Il se déplace à peu près correctement dans ma fenêtre en rebondissant sur les murs. Le problème apparait lorsque j'essaie d'en intégrer plusieurs à ma fenêtre principale, J'ai commenté le fragment provocant l'erreur.

    Voici le code de mes différentes fenêtre :

    Rectangle :
    import java.awt.Color;
    import java.awt.Graphics;
    
    import javax.swing.JPanel;
    
    public class Rectangle extends JPanel implements Runnable {
    
    	/**
    	 * 
    	 */
    	private static final long serialVersionUID = 1L;
    	private int largeur;
    	private int hauteur;
    	private int posX;
    	private int posY;
    	
    	public Rectangle() {
    		
    		this.largeur = 30;
    		this.hauteur = 30;
    		this.posX = 40;
    		this.posY = 80;
    	}
    	public Rectangle(int largeur, int hauteur, int posX, int posY) {
    		
    		this.largeur = largeur;
    		this.hauteur = hauteur;
    		this.posX = posX;
    		this.posY = posY;
    	}
    	
    	public int getLargeur() {
    		
    		return this.largeur;
    	}
    	public int getHauteur() {
    
    		return this.hauteur;
    	}
    	public int getPosX() {
    		
    		return this.posX;
    	}
    	public int getPosY() {
    		
    		return this.posY;
    	}
    	
    	public void setLargeur(int largeur) {
    
    		this.largeur = largeur;
    	}
    	public void setHauteur(int hauteur) {
    		
    		this.hauteur = hauteur;
    	}
    	public void setDimension(int largeur, int hauteur) {
    		
    		this.largeur = largeur;
    		this.hauteur = hauteur;
    	}
    	public void setPosX(int posX) {
    		
    		this.posX = posX;
    	}
    	public void setPoxY(int posY) {
    		
    		this.posY = posY;
    	}
    	public void setCoord(int posX, int posY) {
    		
    		this.posX = posX;
    		this.posY = posY;
    	}
    
    	public void paintComponent(Graphics g) {
            g.setColor(Color.white);
            g.fillRect(posX-1, posY-1, this.getWidth()+1, this.getHeight());
    		g.setColor(Color.BLACK);
    		g.fillRect(posX, posY, largeur, hauteur);
    	}
    	public void run() {
    		
    		int pas = 10;
    		int l = 300;
    		int h = 300;
    		boolean backX = true;
    		boolean backY = false;
    
    		while(true) {
    
    			if(this.getPosX() < 1)
    				backX = true;
    			else if(this.getPosX() > l - this.largeur)
    				backX = false;
    			if(this.getPosY() < 1)
    				backY = true;
    			else if(this.getPosY() > h - this.hauteur)
    				backY = false;
    
    			if(backX)
    				this.setPosX(this.getPosX()+1);
    			else
    				this.setPosX(this.getPosX()-1);
    			if(backY)
    				this.setPoxY(this.getPosY()+1);
    			else
    				this.setPoxY(this.getPosY()-1);
    
    			this.repaint();
    
            	try {
                    Thread.sleep(pas);
            	} catch (InterruptedException e) {
            		e.printStackTrace();
            	}
    		}
    	}
    }
    


    Fenetre :
    import java.awt.Color;
    
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    
    public class Fenetre extends JFrame {
    	
    	private Rectangle re1 = new Rectangle(10, 10, 1, 1);
    	private Rectangle re2 = new Rectangle(10, 10, 200, 200);
    	
    	private JPanel pan = new JPanel();
    	
    	public Fenetre() {
    		
    		this.setTitle("Jeu des rectangles");
    		this.setSize(300, 300);
    		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		this.setLocationRelativeTo(null);
    		//
                    //
                    //
                    // this.setContentPane(re1) aurait fonctionné mais uniquement affiché le premier rectangle. C'est le passage par pan.add() qui semble poser problème
    		pan.add(re1);
    		pan.add(re2);
    		this.setContentPane(pan);
    		pan.setBackground(Color.WHITE);
    		
    		this.setVisible(true);
    		
    		Thread t1 = new Thread(re1);
            t1.start();
            Thread t2 = new Thread(re2);
            t2.start();
    
    	}
    	
    	public Fenetre(int l, int h) {
    		
    		this.setTitle("Jeu des rectangles");
    		this.setSize(l, h);
    		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		this.setLocationRelativeTo(null);
    		this.setVisible(true);		
    	}
    
    }
    


    Main :
    public class Main {
    
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		
    		Fenetre fe = new Fenetre();
    
    	}
    
    }
    



    Lorsque "l'erreur" se manifeste, en passant par un pan.add(re1), j'ai une fenêtre qui apparait, et par moment j'ai un de mes rectangle noir qui apparait en haut au milieu puis disparait.

    Merci et bonne soirée.
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      22 décembre 2009 à 23:21:02

      Salut,

      Tu fais fausse route. Les composants Swing comme les JPanel ne sont pas du tout adaptés pour faire ce genre de choses. Il est inutile de mettre en place un système aussi "complexe" alors que tout ce que tu veux c'est dessiner des rectangles. Renseigne toi plutôt sur Java 2D. Regarde sur developpez.com, il y a un très bon tuto qui devrait te permettre de vite arriver à ce que tu veux.

      ++
      • Partager sur Facebook
      • Partager sur Twitter
        23 décembre 2009 à 10:08:46

        Merci je vais regarder de ce côté ci.
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          23 décembre 2009 à 10:15:59

          Voici le lien, histoire de te faire gagner un peu de temps : Java2D
          • Partager sur Facebook
          • Partager sur Twitter
            24 décembre 2009 à 13:41:39

            Bonjour, j'ai pas vraiment voulu créer un autre sujet puisque c'est en réponse avec le lien de BZ

            Dans le tuto, à un moment on a un

            jc.setBackground(Color.WHITE); //Nes : Avec jc est un JPanel
            



            chez moi ça ne fais strictement rien... est-ce normal? suis-je le seul qui n'arrives pas à définir une couleur d'arrière plan avec cette ligne de code?

            A noter que j'ai copié collé le morceau de code donc c'est le code présent dans le tuto.

            Merci à ceux qui prendront le temps de me répondre car je suis...comment dire... dans l'incompréhension :euh:
            • Partager sur Facebook
            • Partager sur Twitter
              24 décembre 2009 à 14:00:38

              par défauts les JPanels sont transparents je pense

              essaye setOpaque(true);
              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                24 décembre 2009 à 14:51:34

                Salut,

                Si je me souviens bien du tuto, on y définit une classe Canvas qui dérive de JPanel. Pour pouvoir y dessiner des formes on surcharge sa méthode paintComponent. Or c'est cette méthode qui gère tout ce qui concerne l'affichage, et donc également le background.

                Donc, soit, au début de ta méthode paintComponent, tu fais un super.paintComponent(), auquel cas ton JPanel se dessinera normalement et tu pourras ensuite continuer à dessiner par dessus comme tu le veux, soit tu remplis le background toi-même, ce qui n'est pas franchement compliqué avec la méthode fillRect de la class Graphics.

                J'espère que ça t'aidera !

                ++
                • Partager sur Facebook
                • Partager sur Twitter
                  24 décembre 2009 à 15:20:48

                  Citation : BZ

                  Donc, soit, au début de ta méthode paintComponent, tu fais un super.paintComponent(), auquel cas ton JPanel se dessinera normalement et tu pourras ensuite continuer à dessiner par dessus comme tu le veux, soit tu remplis le background toi-même, ce qui n'est pas franchement compliqué avec la méthode fillRect de la class Graphics.

                  J'espère que ça t'aidera !

                  ++



                  Effectivement, ça m'a aidé manquait juste le super.paint(g); et ça foutait la pagaille è_é

                  Ça marche impeccable maintenant. ^^

                  Merci a vous deux :)
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Plusieurs rectangles qui se déplacent...

                  × 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