Bonjour à tous,

Je viens demander votre aide car je me suis déjà tourné vers d'autres forums, sans résultat, et j'ai épluché la FAQ Swing sans succès non plus. Pourtant je suis sûr que la solution à mon problème est très simple. Voilà le topo:

Je développe un jeu 2D type "Angrybirds". Mon programme est structuré comme ceci:

Une classe qui hérite de JFrame, qui contient une classe héritant de JPanel où tout le dessin se passe. Dans la méthode paintComponent de mon JPanel, je parcours une liste d'objets de "ma fabrication" qui représentent les éléments de ma scène virtuellement (coordonnées, taille, points de vie...) pour les dessiner un par un (leur position dans le temps est calculé à l'aide d'un moteur physique).

Le problème que je rencontre est le suivant: je souhaiterais lors d'un clic (plutôt un mouseDragged mais peut importe), différencier les éléments de ma scène pour savoir si je suit sur mon "lance-projectile" et que je n'essaye pas de déplacer un bloc quelconque de la scène. Comment faire cela? je cherche depuis des jours et je n'ai toujours pas trouvé la direction vers laquelle m'orienter:

- est-ce que je dois, dans le mouseDragged, vérifier "à la main" si je suis au bon endroit?

- ou bien est-ce que je dois faire hériter mes objets qui contiennent les données d'un composant particulier, ce qui me permettrait directement de savoir où je clic?

J'espère que vous pourrez m'éclairer là-dessus car je suis débutant en Swing et je commence à perdre espoir

Un peu de code au cas où:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
 
public class Window extends JFrame {
 
	private static final long serialVersionUID = 1L;
 
	public Window(){
        this.setTitle("Angrimac");
        this.setSize(800, 600);
        this.setLocationRelativeTo(null);               
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setContentPane(new Canvas());
        this.setVisible(true);
	}
 
	private class Canvas extends JPanel implements ActionListener{
 
		private static final long serialVersionUID = 1L;
		protected SwingStage stage;
		private Timer refreshTimer;
		private LaunchListener launchListener;
 
 
		public Canvas(){
			this.setBackground(Color.white);
                        //contains and set the stage elements
			this.stage = new SwingStage();
			//set refresh Timer
			this.refreshTimer = new Timer((int) (1000.0 / 60.0), this);
			this.refreshTimer.start();
		}
 
		public void resetTrans(Graphics2D g2) {
			AffineTransform at = new AffineTransform();
			at.setToIdentity();
			g2.setTransform(at);
		}
 
		@Override
		public void paintComponent(Graphics g){
			super.paintComponent(g);
			Graphics2D g2 = (Graphics2D) g;
 
			//draw bodies
			for (DrawableElement elt : stage.drawingList) {
 
				resetTrans(g2);
				g2.setColor(Color.red);
				g2.translate(elt.getBody().getWorldCenter().x, elt.getBody().getWorldCenter().y);
				g2.rotate(elt.getBody().getAngle());
				g2.drawRect(-(elt.getWidth()/2), -(elt.getHeight()/2), elt.getWidth(), elt.getHeight());
			}
 
       }
 
		@Override
		public void actionPerformed(ActionEvent e) {
			this.stage.world.step(1.0f / 60.0f, 10);
			this.repaint();
		}
	}
 
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
 
			public void run() {
				new Window().setVisible(true);
			}
		});
	}
 
}