Forum Programmation.java relier deux points

Posté par  .
Étiquettes : aucune
0
13
nov.
2004
Bonjour;
J'essaye de programmer un jeu, et j'ai commencé par essayé de relier deux points sur une JFrame avec une droite à l'aide de la souris, mais sa ne marche pas, rien ne s'affiche ou ne se dessine, sa fait des jours que j'essaye de trouver pourquoi mais je n'y arrive pas, peut être que vous pouvez m'aider ou m'orienter, voici le code que j'ai écris :

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.geom.*;

public class relierPoints {
public static void main(String args[]){
Fenetre principale = new Fenetre();
principale.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
principale.show();
}
}

class Fenetre extends JFrame {
private Panneau p;
public Fenetre() {
setSize(600, 600);
setLocation(100, 100);
setTitle("JEU SIM");

//barre de menu:
JMenuBar barremenu = new JMenuBar();
setJMenuBar(barremenu);
JMenu joueur = new JMenu("Jeu");
JMenuItem fermer = new JMenuItem("Fermer");

barremenu.add(joueur);
joueur.add(fermer);
fermer.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e){
System.exit(0);
}
}
);

addMouseListener(new souris());

Container contenu = getContentPane();
p = new Panneau ();
contenu.add(p,"Center");
p.repaint();
}
}

class Panneau extends JPanel {
int [] tab1= new int [6];
int [] tab2= new int [6];
public Panneau(){
tab1[0]=300; tab1[1]=400; tab1[2]=400; tab1[3]=300; tab1[4]=200; tab1[5]=200;
tab2[0]=100; tab2[1]=200; tab2[2]=300; tab2[3]=400; tab2[4]=300; tab2[5]=200;
}

public void paintComponent(Graphics g) {
super.paintComponent(g);

Graphics2D g2 =(Graphics2D) g;
Rectangle2D rect1 =new Rectangle2D.Double(300,100,5,5);
Rectangle2D rect2 =new Rectangle2D.Double(400,200,5,5);
//Rectangle2D rect3 =new Rectangle2D.Double(400,300,5,5);
//Rectangle2D rect4 =new Rectangle2D.Double(300,400,5,5);
//Rectangle2D rect5 =new Rectangle2D.Double(200,300,5,5);
//Rectangle2D rect6 =new Rectangle2D.Double(200,200,5,5);

g2.draw(rect1);
g2.draw(rect2);
//g2.draw(rect3);
//g2.draw(rect4);
//g2.draw(rect5);
//g2.draw(rect6);
}
}

class souris extends MouseAdapter {
private int x1, x2, y1, y2, xx, yy;
private int SourisX, SourisY;

public void mouseUp(MouseEvent e){
xx = e.getX();
yy = e.getY();
System.out.println(xx);
System.out.println(yy);
//si je suis à l'interieur du 1er rectangle alors j'initialise x1 et y1 ou x2 et y2
if ((xx < 300+5+4) & (xx > 300+4) & (yy < 100+5+46) & (yy > 100+46)){
if ((x1 != 302+4) & (y1 != 102+46)) {
x2 = 302+4;
y2 = 102+46;
}
else {
x1 = 302+4;
y1 = 102+46;
}
}
else
// la même chose pour le 2eme rectangle
if ((xx < 400+5+4) & (xx > 400+4) & (yy < 200+5+46) & (yy > 200+46)){
if ((x1 != 402+4) & (y1 != 202+46)) {
x2 = 402+4;
y2 = 202+46;
}
else {
x1 = 402+4;
y1 = 202+46;
}
}

}

public void mouseMove(MouseEvent e){
SourisX = e.getX();
SourisY = e.getY();
//repaint();
}

public void paint(Graphics g) {
g.setColor(Color.RED);
//si (x1 , y1) et (x2 , y2) sont bein les coordonées des deux points alors je trace la droite
if (((x1 == 302+4) & (y1 == 102+46))
| ((x1 == 402+4) & (y1 == 202+46))) {
if (((x2 == 302+4) & (y2 == 102+46))
| ((x2 == 402+4) & (y2 == 202+46))) {
g.drawLine(x1, y1, x2, y2);
}
}
else {
//sinon je trace une droite qui n'abouti pas, elle suit seulement le curseur
g.drawLine(x1, y1, SourisX, SourisY);
}
}

}


Merci de m'aider d'avance
  • # si ca peut t'aider

    Posté par  (site web personnel) . Évalué à 2.

    Commence par dessiner dans un JPanel plutôt que directement dans le JFrame.
    Ensuite redéfini la méthode paint(graphics g) de ton JPanel, pas paintComponent. Pour finir je pense qu'il faut mieux ne pas mettre de gestionnaire de placement, cad mettre setLayout(null) dans ton JPanel. Par contre faudra peut être le resizer du coup.
    N'hésite pas à faire des setBackground(Color.GREEN) pour voir si tes JPanel apparaîssent déjà bien dans le JFrame.
    n'oublies pas d'ajouter ton JPanel au JFrame et de faire un pack() après.
    • [^] # Re: si ca peut t'aider

      Posté par  . Évalué à 2.

      Je dirais même que si c'est pour faire un jeu, il faudrait pê utiliser une bibliothéque prévue à cet effet. Ça ne sert à rien de réinventer la roue d'autant plus qu'il doit exister un certain nombre de moteurs graphiques sous l'environnement Java (Java2D, Java3D, voir même les implémentation OpenGL).

      Bref, même si c'est formateur de faire une petite appli de ses propres mimines, c'est embetant de perdre du temps sur des détails technoques comme cela (en plus c'est vraiment que le début, il y aura encore la gestion de chargement d'images (sprite), des doubles buffers et j'en passe).

      Donc mon conseil (qui ne vaut pê pas grand chose) c'est de chercher sur Internet un petit moteur de jeux ou alors une bibliothèque plus haut niveau (comme SDL (J4sdl), DirectX, ou OpenGL (GLjava, Jogl)) pour faire ton jeu.
      • [^] # Re: si ca peut t'aider

        Posté par  (site web personnel) . Évalué à 2.

        En même temps si son idée est d'afficher des ligne en 2D, l'API de Swing fait très bien l'affaire...
        A noter également qu'en prenant un autre API que Swing pour l'affichage, il va bien souvent devoir réinventer la roue, faute d'avoir des LayoutManager, des formes de base qui savent s'afficher, se redimensionner, etc.
        Si c'est pour faire de la 3D, effectivement c'est peut-être pas top, mais si c'est pour faire de la 2D qui ne soit pas à base de sprite (on peut penser à tout ce qui est vectoriel), Swing est sans doute plus adapté que SDL ou autre OpenGL :)
  • # Suggestion

    Posté par  . Évalué à 1.

    A ta place, je ferais : Un composant graphique qui dérive de JComponent. Il redéfinie la méthode paint. Tu l'attache dans ta JFrame. Un composant controleur : Il gère ta souris (implémente MouseListener, MouseMotionListener par exemple). Tu peut stocker quelques informations dans ce composant, ou les éclater dans une troisième classe "Modèle". L'idée, c'est que le controleur connait le composant graphique et vis et versa. Quand ton controleur détecte un changement qui nécéssite un rafraichissement, il invoque la méthode repaint du composant graphique, et c'est tout. La méthode paint prend ses informations sur le modèle, et le dessine. Voici un exemple à ajouter en JFrame. Quand tu clique une fois, ca mémorise la position. Une deuxième fois et ca trace un trait entre les 2. Composant graphique :
    package test;
    import java.awt.Graphics;
    import javax.swing.JComponent;
    
    public class GComp extends JComponent {
    MouseControler ctr=null;
    	
    	public GComp ()
    	{
    		ctr=new MouseControler(this);
    		this.addMouseMotionListener(ctr);
    		this.addMouseListener(ctr);
    	}
    	
    
    	public void paint(Graphics g) {
    		if (ctr.isLineValid())
    			g.drawLine(ctr.getStart().x,ctr.getStart().y,ctr.getStop().x,ctr.getStop().y);
    	}
    }
    
    Contrôleur / Modèle
    package test;
    
    import java.awt.Point;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import java.awt.event.MouseMotionListener;
    
    
    public class MouseControler implements MouseListener, MouseMotionListener {
    	private Point mousePos=new Point(0,0);
    	private Point start=null;
    	private Point stop=null;
    	
    	private int state=0;
    	
    	private GComp c;
    	public MouseControler (GComp c)
    	{
    		this.c=c;
    	}
    
    	public void mouseMoved(MouseEvent e) {
    		mousePos=e.getPoint();
    		c.repaint();
    	}
    
    	public Point getMousePos() {
    		return mousePos;
    	}
    
    	public boolean isLineValid()
    	{
    		if (state==2)
    			return true;
    		return false;
    	}
    
    	public void mouseClicked(MouseEvent e) {
    		switch (state) {
    		case 0:
    			state=1;
    			start=e.getPoint();
    			break;
    		case 1:
    			state=2;
    			stop=e.getPoint();
    			c.repaint();
    			break;
    		default:
    			break;
    		}
    	}
    
    	public void mouseEntered(MouseEvent e) {
    
    	}
    
    
    	public void mouseExited(MouseEvent e) {
    
    	}
    
    
    	public void mousePressed(MouseEvent e) {
    
    	}
    
    
    	public void mouseReleased(MouseEvent e) {
    
    		
    	}
    
    	public void mouseDragged(MouseEvent e) {
    	
    	}
    
    	public Point getStart() {
    		return start;
    	}
    
    	public Point getStop() {
    		return stop;
    	}
    }
    
    
    • [^] # Re: Suggestion

      Posté par  . Évalué à 1.

      Salut; Je vous remercie d'abord pour toutes vos réponses, c'est sympa de votre part d'aider un pauvre debutant comme moi; Pour le poste de "taldius", j'avous que je n'ai pas compris grand :( sa dépasse mes competence, mais j'aimerai bien avoir plus de détails, comment devrais-je utilisé ton code? où devrais-je mettre chaque partie ? En ce qui me concerne j'ai avancé un peu en cherchant, et j'ai fais ce qui suit:
      import java.awt.*; 
      import java.util.Vector; 
      import java.awt.event.*; 
      import javax.swing.*; 
      import java.awt.geom.*;
      
      public class RelierPoints { 
          public static void main(String args[]){ 
              Fenetre principale = new Fenetre(); 
              principale.show(); 
              principale.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
          } 
      } 
      
      class Fenetre extends JFrame { 
          private Panneau p; 
           public Fenetre() { 
              setSize(600, 600); 
              setLocation(100, 100); 
              setTitle("JEU SIM"); 
      
              //barre de menu: 
              JMenuBar barremenu = new JMenuBar(); 
              setJMenuBar(barremenu); 
              JMenu joueur = new JMenu("Jeu"); 
              JMenuItem fermer = new JMenuItem("Fermer"); 
              
              barremenu.add(joueur); 
              joueur.add(fermer); 
              fermer.addActionListener( 
                 new ActionListener(){ 
                   public void actionPerformed(ActionEvent e){ 
                      System.exit(0); 
                   } 
                } 
                 ); 
              
              Container contenu = getContentPane(); 
              p = new Panneau (); 
              contenu.add(p,"Center"); 
          } 
            
           public void paint(){ 
             p.dessiner(getGraphics()); 
          } 
      
      } 
      
      class Panneau extends JPanel implements MouseListener { 
          
         Vector figures; 
         int courant; 
         int [] tab1= new int [6];
         int [] tab2= new int [6];
          
         public Panneau(){ 
            figures = new Vector(); 
            courant = 0; 
            addMouseListener(this); 
            tab1[0]=300; tab1[1]=400; tab1[2]=400; tab1[3]=300; tab1[4]=200; tab1[5]=200;
            tab2[0]=100; tab2[1]=200; tab2[2]=300; tab2[3]=400; tab2[4]=300; tab2[5]=200;
         } 
          
         public void mouseClicked(MouseEvent e){} 
         public void mouseEntered(MouseEvent e){} 
         public void mouseExited(MouseEvent e){} 
         public void mousePressed(MouseEvent e){ 
            Trait t = new Trait(); 
            t.initPoint1(e.getX(),e.getY()); 
            figures.addElement(t); 
            courant=figures.size()-1; 
         } 
          
         public void mouseReleased(MouseEvent e){ 
            Trait t = (Trait)figures.elementAt(courant); 
            t.initPoint2(e.getX(),e.getY()); 
            dessiner(getGraphics()); 
         } 
          
         public void dessiner(Graphics g) { 
              for(int i=0 ; i<figures.size(); i++){ 
                 Figure f = (Figure)figures.elementAt(i); 
                 f.dessiner(g); 
              } 
         } 
         
         public void paintComponent(Graphics g) {
          super.paintComponent(g);
      
              Graphics2D g2 =(Graphics2D) g;
              Rectangle2D rect1 =new Rectangle2D.Double(300,100,5,5);
              Rectangle2D rect2 =new Rectangle2D.Double(400,200,5,5);
              //Rectangle2D rect3 =new Rectangle2D.Double(400,300,5,5);
              //Rectangle2D rect4 =new Rectangle2D.Double(300,400,5,5);
              //Rectangle2D rect5 =new Rectangle2D.Double(200,300,5,5);
              //Rectangle2D rect6 =new Rectangle2D.Double(200,200,5,5);
      
              g2.draw(rect1);
              g2.draw(rect2);
              //g2.draw(rect3);
              //g2.draw(rect4);
              //g2.draw(rect5);
              //g2.draw(rect6);       
              }
      } 
      
      abstract class Figure{ 
      
          public abstract void dessiner(Graphics g); 
          
      } 
      
      class Trait extends Figure{ 
          
         public int x1,x2,y1,y2; 
          
         public void initPoint1(int x, int y){ 
            x1 = x; 
            y1 = y; 
         } 
         public void initPoint2(int x, int y){ 
            x2=x; 
            y2=y; 
         } 
          
         public void dessiner(Graphics g){ 	
            g.drawLine(x1,y1,x2,y2); 
         } 
      } 
      
      
      Et j'ai une question, je vais commencé d'abord par donné plus de details de ce que je veux faire:
      On a deux joureurs ou deux couleur, il ya six sommets (ptits rectangle)sur la fenêtre, chaque joureur à son tour trace un trait qui reli deux sommets et ainsi de suite jusqu'à ce qu'il fasse un triangle, et le premier qui fait le plus de triangle a gagné...
      
      Alors ma question est que comment je peux verifier si un joureur à cliqué à l'interieur d'un sommet ? il faut que je verifie les coordonnées de la sourie et je les compare avec ceux du sommet, mais je n'arrive à trouver l'endorit où je met ma procedure...
      
      Merci inifiniment de vtre aide

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.