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

 Java Discussion :

Gestion de zone du curseur


Sujet :

Java

  1. #1
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2013
    Messages : 8
    Par défaut Gestion de zone du curseur
    Bonjour,

    Je suis débutante en Java et j'ai pour but de contrôler les action de ma souris sur une image.

    Je m'explique, j'affiche une image et choisis la localisation de la souris mais ensuite, je dois faire en sorte que la souris ne puisse pas sortir d'une certaine zone (délimitée en noir). Donc au contact de pixels noirs, la souris doit être stoppée.

    Je n'arrive pas à créer cette partie du programme.

    Quelqu'un saurait-il m'indiquer comment utiliser le MouseListener ?

    Voici mon programme
    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
    import java.awt.AWTException;
    import java.awt.Robot;
    import java.awt.BorderLayout;
    import java.awt.Graphics;
    import java.awt.Image;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
     
    class GlobalConsoleFrame extends JFrame
    {
        GlobalConsoleFrame()
        {
            setSize(1280, 1024);
            setTitle("Test");
            setContentPane(new AfficheImage("img.PNG"));
            getContentPane().setLayout(new BorderLayout());
            this.setVisible(true);
        }
    }
     
    class AfficheImage extends JPanel
    {
        Image eau;
     
        AfficheImage(String s)
        {
            eau = getToolkit().getImage(s);
        }
     
        public void paintComponent(Graphics g)
        {
            super.paintComponent(g);
            g.drawImage(eau, 0, 0, getWidth(), getHeight(), this);
        }
    }
     
    public class ImagePanel {
     
        public ImagePanel() throws AWTException {
     
            Robot robot = new Robot();
            robot.setAutoDelay(5);
            robot.setAutoWaitForIdle(false);
     
            for (int i = 0; i < 14; i++) {
                robot.mouseMove(400+(20*i), 900);
            }
        }    
     
        public static void main(String[] args) throws AWTException
        {
            GlobalConsoleFrame test = new GlobalConsoleFrame();
            ImagePanel mouseCatchMe = new ImagePanel();
        }
    }
    Merci d'avance pour votre aide.

  2. #2
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 312
    Par défaut
    Bonjour,

    Il faut que tu associes un GraphicsDevice (en l'occurence l'ecran dans mon exemple) au robot afin qu'il puisse avoir un repère pour les coordonnées de la souris. Le Robot fonctionne alors en autonome. (sans image intégrée au programme).

    Tu utilises ensuite un test sur la couleur du point courant avec getPixelColor() et en fonction du dévie le chemin de ta souris.

    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
     
    import javax.swing.*;
    import java.awt.*;
    import java.util.*;
     
    public class TestRobot{
     
    	public TestRobot() throws AWTException {
        	    GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
        	    Robot robot = new Robot(gd);
        	    robot.setAutoDelay(40);
        	    robot.setAutoWaitForIdle(false);
        	    int dx = 10;
        	    int x =400;
        	    int y = 400;
        	    while (x>0 && x <=1000) {
     
        	    	    x = x + dx;
        	    	    robot.mouseMove(x, y);
        	    	    if (robot.getPixelColor(x,y).equals(Color.black))
        	    	    	    dx = -dx;
        	    }
        }    
     
        public static void main(String[] args) throws AWTException
        {
        	    TestRobot mouseCatchMe = new TestRobot();
        }
    }
    C'est ainsi que fonctionnent les robots, par contre pour ton cas, je ne suis pas sur que ce soit ce que tu veux????Si c'est toi qui bouge ta souris mais que tu ne veux pas qu'elle dépasse le cadre noir, il faut effectivement utiliser un MouseMotionListener. Tiens moi au courant

  3. #3
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2013
    Messages : 8
    Par défaut Merci
    Merci beaucoup pour ta réponse.

    En effet je dois faire en sorte de déplacer la souris dans un labyrinthe sans toucher les bords (pixels noirs) et donc sans pouvoir traverser les pixels noirs.

    Mais je ne sais pas comment je dois gérer mon MouseMotionListener, que mettre dedans?

    Merci d'avance

  4. #4
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 312
    Par défaut
    Bonjour,

    Si tu veux bouger la souris à la main et tester la couleur des pixels survolés, c'est possible mais tu ne pourras pas arrêter la souris. La solution que je te propose est de creer un Sprite (ici un carre rouge) qui bougera comme la souris et qui s'arretera de bouger s'il rencontre un mur.

    Pour utiliser l'interface MouseMotionListener il faut que tu implementes les 2 methodes de l'interface, soit mouseDragged et mouseMoved même si tu n'en a pas besoin. Tu ajoutes alors le listener au composant que tu veux a l'aide de addMouseMotionListener(this)

    ici je me sers de mouseMoved ppour recuperer la position de la souris et faire les tests de collision. Tu ajoutes alors le listener au composant que tu veux a l'aide de addMouseListener(this)

    Pour utiliser l'interface MouseListener il faut que tu implementes les 5 methodes de l'interface, soit mouseEntered, mouseExited, mouseReleased, mousePressed et mouseClicked même si tu n'en a pas besoin.

    ici je me sers de mouseClicked pour lancer le jeu(il faut clicker sur le carre rouge pour demarrer)

    pour le labyrinthe, j'ai creer une Area qui correspond au chemin blanc et je teste la collision en verifiant à chaque mouvement de la souris si le sprite est contenu dans cette Area.

    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
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
     
    import javax.swing.*;
    import java.awt.event.*;
    import java.awt.*;
    import javax.imageio.*;
    import java.io.*;
    import java.awt.geom.*;
    import java.util.*;
     
    public class Labyrinth extends JPanel implements MouseListener, MouseMotionListener {
     
    	JPanel sprite; 
    	Area forme=new Area();
     
    	public Labyrinth() {
    		setBackground(Color.black);	
    		creationLabyrinth();
    		sprite = new JPanel();
    		sprite.setBackground(Color.red);
    		sprite.setBounds(125,450,30,30);
    		sprite.addMouseListener(this);
    		setLayout(null);
    		add(sprite);
     
    	}
     
    	public void paintComponent(Graphics g) {
    		Graphics2D g2 = (Graphics2D) g.create();
    		g2.setBackground(Color.black);
    		g2.clearRect(0,0,getWidth(),getHeight());
    		g2.setColor(Color.white);
    			g2.fill(forme);
    	}
     
    	public static void main(String[] args) {
    		JFrame f = new JFrame();
    		Labyrinth l = new Labyrinth();
    		f.setSize(650,650);
    		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		f.add(l,BorderLayout.CENTER);
    		f.setVisible(true);	
    	}
     
    	public void mouseEntered(MouseEvent e) {
     
    	}
    	public void mouseExited(MouseEvent e) {
     
    	}
    	public void mouseReleased(MouseEvent e) {
     
    	}
    	public void mousePressed(MouseEvent e) {
     
    	}
    	public void mouseClicked(MouseEvent e) {
    		addMouseMotionListener(this);
    		sprite.removeMouseListener(this);
    	}
    	public void mouseMoved(MouseEvent e) {
    		boolean interception = false;
    			if(forme.contains(new Rectangle(e.getX()-15,e.getY()-15,30,30)))
    				sprite.setLocation(e.getX()-15,e.getY()-15);
    	}
    	public void mouseDragged(MouseEvent e) {
     
    	}
     
    	public void creationLabyrinth() {
    			ArrayList<Area> murs = new ArrayList<Area>();
    			Area rect;
    			rect = new Area(new Rectangle2D.Double(100,100,100,400));
    			murs.add(rect);
    			rect = new Area(new Rectangle2D.Double(200,100,100,100));
    			murs.add(rect);
    			rect = new Area(new Rectangle2D.Double(300,100,100,400));
    			murs.add(rect);
    			for (int i=0; i< murs.size(); i++)
    				forme.add(murs.get(i));
    	}
    }

  5. #5
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2013
    Messages : 8
    Par défaut
    Tout d'abord je te remercie de ton aide, j'avance petit à petit.

    Es-tu certain qu'il n'est pas possible de stopper la souris lorsqu'elle rentre un pixel noir?
    J'utilise cette image pour exécuter mon programme.
    Nom : img.PNG
Affichages : 415
Taille : 10,7 Ko

    Ensuite, je transforme mon curseur en étoile ci-dessous:
    Nom : star.gif
Affichages : 514
Taille : 177,6 Ko

    Et en fait je dois faire en sorte que la souris ne puisse jamais traverser les pixels noirs.

    Et je coince depuis un moment sur ce passage du programme.

  6. #6
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 312
    Par défaut
    Bonjour,

    Avec tous les détails, c'est plus facile

    Tout d'abord tu trouveras en pièce jointe l'etoile redimensionnée pour le curseur.
    Voici maintenant une petite explication du programme qui suit :

    J'affiche l'image de fond dans un JPanel auquel j'ajoute un MouseMotionListener afin de pouvoir récupérer les coordonnées de la souris.

    Je crée ensuite mon robot qui me permettra de modifier l'emplacement de la souris par le code et je positionne cette souris au Départ sur l'image de fond.

    Attention, il y a une différence entre les coordonnées vues par le robot (par rapport à l'écran) et les coordonnées récupérees par mouseMoved qui sont par rapport au JPanel. Il faut donc que tu calcules le décalage.

    Chez moi, le x est identique et je dois rajouter 44 à y du Jpanel pour avoit y du robot.

    Dans la methode mouseMoved je fais le test suivant :

    si la couleur du pixel n'est pas noire alors j'enregistre les coordonées de la souris (la encore dans le test j'utilise le robot il faut donc que j'ajoute 44 à e.getY() ) dans x et y.

    si la couleur est noire je replace la souris aux dernières coordonnées x et y enregistrées (et comme je n'enregistre x et y que dans le blanc ca revient à replacer la souris dans le blanc)

    Voilà voilà. Il y a un petit soucis néanmoins, dès que tu bouges la souris trop vite elle passe à travers le trait noir. En effet la methode mouseMoved ne retient que la dernière position de la souris et donc elle ne repère pas que tu es passée par le noir.

    Une solution pas top mais meilleure consisterait à elargir les traits moirs afin de diminuer ce phénomène.

    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
     
    import javax.swing.*;
    import java.awt.*;
    import java.util.*;
    import java.awt.event.*;
    import javax.imageio.*;
    import java.io.*;
     
    public class TestRobot extends JPanel implements MouseMotionListener{
     
    	int x =207;
        	int y = 158;
        	Robot robot;
        	Image fond;
     
    	public TestRobot()   {	    
    		setSize(586,431);
    		try {
    			fond = ImageIO.read(new File("img.png"));
    			Image star = ImageIO.read(new File("star32.gif"));
    			Toolkit tk = Toolkit.getDefaultToolkit();
    			Cursor monCurseur = tk.createCustomCursor(star, new Point(16, 16), "star");
    			setCursor(monCurseur);
    		}
    		catch(IOException ee) {} 
    		addMouseMotionListener(this);  	    
    		try {
    			robot = new Robot();
    			robot.setAutoDelay(0);
    			robot.setAutoWaitForIdle(false);
    			robot.mouseMove(x, y);
    		}
    		catch(AWTException ee){}
        	}  
     
        	public void mouseMoved(MouseEvent e) {
        		if (!robot.getPixelColor(e.getX(),e.getY()+44).equals(Color.black)) {
        			x = e.getX();
        			y = e.getY()+44;
        		}
        		else {
        			robot.mouseMove(x, y);	
        		}
        	}
        	public void mouseDragged(MouseEvent e) {
     
        	}
     
     
        public static void main(String[] args)  {
        	    JFrame f = new JFrame();
        	    f.setSize(600,600);
        	    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
        	    TestRobot rob = new TestRobot();
        	    f.add(rob,BorderLayout.CENTER);
        	    f.setVisible(true);
        }
     
        public void paintComponent(Graphics g) {
    		Graphics2D g2 = (Graphics2D) g.create();
    		g2.drawImage(fond,0,0,null);
    	}
    }
    Images attachées Images attachées  

  7. #7
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2013
    Messages : 8
    Par défaut
    Merci beaucoup de ton aide, je vais bosser pour bien tout comprendre.

    Je referais appel à toi si j'ai un souci ^^

    Merci bien

  8. #8
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2013
    Messages : 8
    Par défaut
    Re-bonjour,

    J'ai retravaillé sur le programme. Cela marche à peu près mais il arrive que le curseur parvienne a traverser les pixels noirs. A quoi celà est-il du?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public void mouseMoved(MouseEvent e) {
        		if (!robot.getPixelColor(e.getX(),e.getY()+44).equals(Color.black)) {
        			x = e.getX();
        			y = e.getY()+44;
    J'aimerais savoir, à quoi correspondent les "+44".

    Merci.

  9. #9
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 312
    Par défaut
    Bonjour,

    Le 44 représente chez moi, la translation qu'il faut faire pour passer du système de coordonnées de ton écran (utilisé par l'Objet ROBOT) au système de coordonnées du JPanel (utilisé par MouseEvent pour récupérer les coordonnées de la souris). cf image jointe.

    Pour le curseur qui traverse le trait noir, comme je t'ai expliqué sur le précédent message, c'est du au fait que lorsque tu bouges la souris trop vite java ne peut pas récupérer les coordonnées de la souris à chaque instant et donc s'il ne récupère pas celle pendant lesquelles la souris était sur le noir il ne le voit pas.

    Si tu as la possibilité de redessiner le labyrinthe une solution serait de faire les traits noirs plus gros afin de limiter ce problème.
    Images attachées Images attachées  

  10. #10
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Plutôt que d'essayer de contraindre la souris avec le robot, ce qui va donner un résultat pas franchement hyper satisfaisant, je te conseille autre chose de potentiellement plus propre:

    Cacher le curseur de la souris (en utilisant une image transparente et petite et du http://docs.oracle.com/javase/7/docs...lang.String%29)

    Puis de dessiner sur le composant l'emplacement où est censé se trouver le curseur. De fait, tu auras toute latitude dessiner le (faux) curseur à l'endroit idoine, et à réagir en fonction des mouvements de la souris).

  11. #11
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 312
    Par défaut
    Citation Envoyé par sinok Voir le message
    Cacher le curseur de la souris
    Puis de dessiner sur le composant l'emplacement où est censé se trouver le curseur. De fait, tu auras toute latitude dessiner le (faux) curseur à l'endroit idoine, et à réagir en fonction des mouvements de la souris).
    Oui c'est un peu ce que j'avais suggéré au dessus mais visiblement il faut utiliser directement la souris.....

  12. #12
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2013
    Messages : 8
    Par défaut
    Merci à tous pour vos réponses.

    En effet, il me faut utiliser directement la souris.

    Il me reste un dernier point à régler.
    Je dois utiliser un peu le même principe que précédemment, mais cette fois ci, le curseur doit rester dans le trajet du labyrinthe en blanc. Dès qu'une autre couleur est rencontrée, le curseur doit se heurter.

    Je sais qu'il s'agit d'un peu la même chose, mais je pense que cette méthode fonctionnerait mieux. Comment dois-je m'y prendre et qu'en pensez-vous?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Graphes de signaux mixte: gestion des zones tracés
    Par aurelien_despaux dans le forum LabVIEW
    Réponses: 0
    Dernier message: 14/05/2012, 17h16
  2. Réponses: 7
    Dernier message: 08/12/2007, 15h37
  3. [JTextField] Gestion du curseur
    Par webbulls dans le forum Composants
    Réponses: 4
    Dernier message: 19/07/2005, 11h11
  4. [debutant] Changer le curseur au survol d'une zone reactive
    Par cosmos.1097 dans le forum Général Java
    Réponses: 3
    Dernier message: 30/06/2005, 17h19
  5. forcer le curseur à ce positionner dans une zone texte
    Par caton dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 08/04/2005, 15h17

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