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 TImaniac (site web personnel) . Évalué à 2.
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 pifou . Évalué à 2.
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 TImaniac (site web personnel) . Évalué à 2.
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 taldius . Évalué à 1.
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èlepackage 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 ryadus . Évalué à 1.
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); } }Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.