IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

2D Java Discussion :

[Swing] Différencier des objets


Sujet :

2D Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 4
    Par défaut [Swing] Différencier des objets
    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);
    			}
    		});
    	}
     
    }

  2. #2
    Membre Expert Avatar de rtg57
    Homme Profil pro
    Autodidacte
    Inscrit en
    Mars 2006
    Messages
    1 341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 341
    Par défaut
    Bonjour,

    j'ai été confronté à un problème similaire: j'ai une espèce de "table" qui ne peut pas être représentés par une JTable.
    Il est constitué de plusieurs tableaux de JLabel.
    Lorsque l'utilisateur clique sur l'un de ces éléments, j'ai besoin de savoir lequel est-ce. Je ne voulais pas passer par un système fastidieux de "localisation" du clic souris, par rapport à une table de coordonnées, qui avec de multiple if{} elseif {}... me donnerait le composant sollicité.
    Alors j'ai détourné une propriété de JLabel pour y mettre des coordonnées d'identification. J'utilise JLabel.setDisplayedMnemonic(). Par exemple, si le repérage doit se faire par semaine, jour et parametre, j'utilise le code suivant pour les repérer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    monLabel.setDisplayedMnemonic( index_semaine << 24 | index_jour << 16 | parametre );
    La propriété étant un entier 32 bits, je peux y "glisser" 4 octets d'identification.
    Ensuite il est facile de connaitre par exemple, de quel jour fait partie le composant, en isolant l'octet correpondant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    (byte)( getDisplayedMnemonic() >> 16 );
    Le problème est que tous les composants Swing ne fournissent pas cette propriété.
    Alors j'ai décidé d'étendre les composants Swing en y ajoutant un propriété personnelle : tagID, dans laquelle je mets ce que je veux.

    Et voila, c'est peut être pas conventionnel, mais le système D permet de faire avancer les choses

    J'espère que cela vous aidera à avancer dans votre projet. @ bientôt...

  3. #3
    Membre très actif
    Avatar de william44290
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Juin 2009
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 400
    Par défaut
    (Pour rtg57)

    Pour info, j'utilise le putClientProperty et getClientProperty qui est illimité et dispo sur tous les JComponent. de plus on peut lui associer un listener. Cela me semble plus adapté.

  4. #4
    Membre Expert Avatar de rtg57
    Homme Profil pro
    Autodidacte
    Inscrit en
    Mars 2006
    Messages
    1 341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 341
    Par défaut
    Merci pour l'info

    Il n'est jamais trop tard pour apprendre !

Discussions similaires

  1. serialiser des objets Swing
    Par mitoubra dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 09/11/2008, 10h20
  2. Placer des objets avec swing
    Par crossbowman dans le forum AWT/Swing
    Réponses: 8
    Dernier message: 22/08/2007, 23h05
  3. Utiliser des objets SWING dans une vue RCP
    Par manuga72 dans le forum Eclipse Platform
    Réponses: 1
    Dernier message: 20/10/2006, 17h26
  4. Créer des objets sur la pile ?
    Par Cornell dans le forum Langage
    Réponses: 8
    Dernier message: 03/03/2003, 11h47
  5. Importer des objets de 3dsMax
    Par Anonymous dans le forum OpenGL
    Réponses: 3
    Dernier message: 06/05/2002, 13h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo