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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 : 404
Taille : 10,7 Ko

    Ensuite, je transforme mon curseur en étoile ci-dessous:
    Nom : star.gif
Affichages : 503
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  

+ 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, 16h16
  2. Réponses: 7
    Dernier message: 08/12/2007, 14h37
  3. [JTextField] Gestion du curseur
    Par webbulls dans le forum Composants
    Réponses: 4
    Dernier message: 19/07/2005, 10h11
  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, 16h19
  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, 14h17

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