Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème de déplacement par un keyListener

Sujet résolu
    23 août 2016 à 19:44:32

    Bonjour je suis débutant en java et je voudrais créer un petit rpg. Je voudrait pouvoir déplacer mon petit personnage (qui est un carré) par des touches du clavier qui sont les flèches directionnelles. Sauf que ça ne marche pas.

    Classe main (ma fenêtre et les conditions de déplacement)

    import javax.swing.JFrame;
    
    public class Main {
    	static Panel panel = new Panel();
    	public static keyListener kl = new keyListener();
    	
    	static int hb = 250; 
    	static int dg = 250; 
    	
    	public static void main(String[] args) {
    		JFrame frame = new JFrame();
    		frame.setSize(500, 500);
    		frame.add(panel);
    		frame.setLocationRelativeTo(null);
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		frame.setVisible(true);
    		
    		frame.addKeyListener(kl);
    		
    		
    		if(kl.devant == true){Main.hb -= 10;}
    		if(kl.arriere == true){Main.hb += 10;}
    		if(kl.gauche == true){Main.dg -= 10;}
    		if(kl.droite == true){Main.dg += 10;}
    	}
    
    }
    
    import java.awt.Color;
    import java.awt.Graphics;
    
    import javax.swing.JPanel;
    
    public class Panel extends JPanel{
    	public void paintComponent(Graphics g){
    		g.setColor(Color.RED);
    		g.fillRect(Main.dg, Main.hb, 10, 10);
    		
    	}
    
    }
    
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    
     public class keyListener implements KeyListener{
    	public boolean devant = false;
    	public boolean gauche = false;
    	public boolean droite = false;
    	public boolean arriere = false;
    	
    	
    
    	@Override
    	public void keyTyped(KeyEvent e) {
    		// TODO Auto-generated method stub
    		
    	}
    
    	@Override
    	public void keyPressed(KeyEvent event) {
    		if(event.getKeyCode() == 38){devant = true;}
    		if(event.getKeyCode() == 37){gauche = true;}
    		if(event.getKeyCode() == 39){droite = true;}
    		if(event.getKeyCode() == 40){arriere = true;}
    		
    		
    		
    	}
    
    	@Override
    	public void keyReleased(KeyEvent event) {
    		if(event.getKeyCode() == 38){devant = false;}
    		if(event.getKeyCode() == 37){gauche = false;}
    		if(event.getKeyCode() == 39){droite = false;}
    		if(event.getKeyCode() == 40){arriere = false;}
    	}
    	
    		
    		
    
    
    }





    • Partager sur Facebook
    • Partager sur Twitter
      24 août 2016 à 8:57:32

      Hello,

      Tes tests kl.devant, etc ne sont fais qu'une seule fois. Il faudrait les mettre dans une boucle !

      • Partager sur Facebook
      • Partager sur Twitter
        24 août 2016 à 11:24:27

        J'ai fait comme tu me l'as dit et j'ai placé mes tests dans une boucle while mais c'as n'a rien fait.

        while(true){
        		if(kl.devant == true){Main.hb -= 10;}
        		if(kl.arriere == true){Main.hb += 10;}
        		if(kl.gauche == true){Main.dg -= 10;}
        		if(kl.droite == true){Main.dg += 10;}
        		System.out.println("Eexec");
        		}



        • Partager sur Facebook
        • Partager sur Twitter
          24 août 2016 à 11:46:14

          change le nom de ton panel, il est similaire à celui du package awt. Es-tu certain d'utiliser ta class perso quand tu fait

          JFrame frame = new JFrame();

          ?

          il faut un repaint de ton panel dans ta boucle, sinon, tu ne vois pas le changement

          PS: me suis planté, c'est ta class Panel qui peut porter à confusion

          -
          Edité par ukusan 24 août 2016 à 16:32:48

          • Partager sur Facebook
          • Partager sur Twitter
            24 août 2016 à 15:49:23

            J'ai suivi tes instructions en renommant mon panel en pan ainsi que ma JFrame frame en fenetre et j'ai ajouté l'instruction pan.repaint() dans ma boucle while mais ça n'a toujours rien fait.

            static Panel pan = new Panel();
            JFrame fenetre = new JFrame();
            while(true){
            		if(kl.devant == true){Main.hb -= 10;}
            		if(kl.arriere == true){Main.hb += 10;}
            		if(kl.gauche == true){Main.dg -= 10;}
            		if(kl.droite == true){Main.dg += 10;}
            		pan.repaint();





            • Partager sur Facebook
            • Partager sur Twitter
              24 août 2016 à 15:57:19

              import javax.swing.JFrame;
               
              public class Main {
                  static MyPanel panel = new MyPanel();
                  public static keyListener kl = new keyListener();
                        
                  public static void main(String[] args) {
                      JFrame frame = new JFrame();
                      frame.setSize(500, 500);
                      frame.add(panel);
                      frame.setLocationRelativeTo(null);
                      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                      frame.setVisible(true);
              
              	while(true){
                      	if(kl.devant == true){MyPanel.hb -= 10;}
                      	if(kl.arriere == true){MyPanel.hb += 10;}
                      	if(kl.gauche == true){MyPanel.dg -= 10;}
                      	if(kl.droite == true){MyPanel.dg += 10;}
                      	panel.repaint();
                      }
              }




              import java.awt.Color; import java.awt.Graphics; import javax.swing.JPanel; public class MyPanel extends JPanel{ public static int hb = 250; public static int dg = 250; public void paintComponent(Graphics g){ g.setColor(Color.RED); g.fillRect(MyPanel.dg, MyPanel.hb, 10, 10); } }


              • Partager sur Facebook
              • Partager sur Twitter
                24 août 2016 à 16:16:50

                Il ne se passe toujours rien

                • Partager sur Facebook
                • Partager sur Twitter
                  24 août 2016 à 16:31:47

                  de mes souvenir il faut peut être faire le repaint sur la frame
                  • Partager sur Facebook
                  • Partager sur Twitter
                    24 août 2016 à 16:43:24

                    J'ai essayé de repaint ma frame dans la boucle, rien.

                     Puis j'ai essayé de repaint la frame et le panel, mais toujours rien.

                    :(

                    • Partager sur Facebook
                    • Partager sur Twitter
                      24 août 2016 à 17:03:12

                      dans ta boucle, fais un system.out.print pour afficher tes variables static et voir si elles changent bien.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        25 août 2016 à 9:03:59

                        import javax.swing.JFrame;
                         
                        public class Main {
                            static MyPanel panel = new MyPanel();
                            public static keyListener kl = new keyListener();
                             
                            static int hb = 250;
                            static int dg = 250;
                             
                            public static void main(String[] args) {
                                JFrame frame = new JFrame();
                                frame.setSize(500, 500);
                                frame.add(panel);
                                frame.setLocationRelativeTo(null);
                                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                                frame.setVisible(true);
                                 
                                frame.addKeyListener(kl);
                                 
                                 
                                while(true){
                                	try {
                        				Thread.sleep(100);
                        			} catch (InterruptedException e) {
                        				// TODO Auto-generated catch block
                        				e.printStackTrace();
                        			}
                                	
                                    if(kl.devant == true){Main.hb -= 10;}
                                    if(kl.arriere == true){Main.hb += 10;}
                                    if(kl.gauche == true){Main.dg -= 10;}
                                    if(kl.droite == true){Main.dg += 10;}
                                    frame.repaint();
                                    System.out.println(Main.hb);
                                    }
                            }
                         
                        }
                        import java.awt.Color;
                        import java.awt.Graphics;
                         
                        import javax.swing.JPanel;
                         
                        public class MyPanel extends JPanel{
                            public void paintComponent(Graphics g){
                                g.setColor(Color.RED);
                                g.fillRect(Main.dg, Main.hb, 10, 10);
                                 
                            }
                         
                        }

                        import java.awt.event.KeyEvent;
                        import java.awt.event.KeyListener;
                         
                         public class keyListener implements KeyListener{
                            public boolean devant = false;
                            public boolean gauche = false;
                            public boolean droite = false;
                            public boolean arriere = false;
                             
                             
                         
                            @Override
                            public void keyTyped(KeyEvent e) {
                                // TODO Auto-generated method stub
                                 
                            }
                         
                            @Override
                            public void keyPressed(KeyEvent event) {
                                if(event.getKeyCode() == 38){devant = true;}
                                if(event.getKeyCode() == 37){gauche = true;}
                                if(event.getKeyCode() == 39){droite = true;}
                                if(event.getKeyCode() == 40){arriere = true;}
                                 
                                 
                                 
                            }
                         
                            @Override
                            public void keyReleased(KeyEvent event) {
                                if(event.getKeyCode() == 38){devant = false;}
                                if(event.getKeyCode() == 37){gauche = false;}
                                if(event.getKeyCode() == 39){droite = false;}
                                if(event.getKeyCode() == 40){arriere = false;}
                            }
                        }


                        PS: ça fonctionne mais niveau conception, c'est pas top, tu devrais avoir des getter pour avoir les valeurs devant,gauche, etc. Tu devrais avoir une méthode pour dire à ton cube que sa position est modifié de X pour les ordonnées et Y pour les abscisses (et surtout, ne pas passer par des variables globales. Je te refais ça au propre

                        package moves;
                        
                        import java.awt.Color;
                        
                        import javax.swing.JFrame;
                        import javax.swing.JPanel;
                        
                        public class Jeu {
                        	
                        	private JFrame frame;
                        	private KeyBoard listener;
                        	private Bloc bloc;
                        	private Plateau plateau;
                        	
                        	private static int pas = 10;
                        	public final static int width = 500;
                        	public final static int height = 500;
                        	public Jeu(){
                        		bloc = new Bloc(width/2,height/2);
                        		frame = new JFrame();
                        		listener = new KeyBoard();
                        		plateau = new Plateau(bloc);
                        		frame.addKeyListener(listener);
                                frame.setSize(width, height);
                                frame.setLocationRelativeTo(null);
                                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                                frame.add(plateau);
                                frame.setVisible(true);
                        	}
                        	
                        	public void run(){
                        		while(true){
                        			int changeX=0;
                        			int changeY=0;
                        			if(listener.isDevant()){changeY -= pas;}
                                    if(listener.isArriere()){changeY += pas;}
                                    if(listener.isGauche()){changeX -= pas;}
                                    if(listener.isDroite()){changeX += pas;}
                                    bloc.goTo(changeX, changeY);
                                    frame.repaint();
                                    try {
                        				Thread.sleep(100);
                        			} catch (InterruptedException e) {
                        				// TODO Auto-generated catch block
                        				e.printStackTrace();
                        			}
                        		}
                        	}
                        
                        	public static void main(String[] args) {
                        		Jeu jeu = new Jeu();
                        		jeu.run();
                        	}
                        }
                        
                        package moves;
                        
                        import java.awt.event.KeyEvent;
                        import java.awt.event.KeyListener;
                        
                        public class KeyBoard implements KeyListener{
                        	
                        	private boolean devant = false;
                        	private boolean gauche = false;
                        	private boolean droite = false;
                        	private boolean arriere = false;
                        	 
                            public boolean isDevant() {
                        		return devant;
                        	}
                        
                        	public boolean isGauche() {
                        		return gauche;
                        	}
                        
                        	public boolean isDroite() {
                        		return droite;
                        	}
                        
                        	public boolean isArriere() {
                        		return arriere;
                        	}
                        
                        	@Override
                            public void keyTyped(KeyEvent e) {
                                // TODO Auto-generated method stub
                                 
                            }
                         
                            @Override
                            public void keyPressed(KeyEvent event) {
                                if(event.getKeyCode() == 38){devant = true;}
                                if(event.getKeyCode() == 37){gauche = true;}
                                if(event.getKeyCode() == 39){droite = true;}
                                if(event.getKeyCode() == 40){arriere = true;}
                          
                            }
                         
                            @Override
                            public void keyReleased(KeyEvent event) {
                                if(event.getKeyCode() == 38){devant = false;}
                                if(event.getKeyCode() == 37){gauche = false;}
                                if(event.getKeyCode() == 39){droite = false;}
                                if(event.getKeyCode() == 40){arriere = false;}
                            }
                        
                        }
                        
                        package moves;
                        
                        import java.awt.Graphics;
                        import java.awt.Graphics2D;
                        
                        public class Bloc {
                        	private int x;
                        	private int y;
                        
                        	public Bloc(int x, int y) {
                        		this.x = x;
                        		this.y = y;
                        	}
                        
                        	public void goTo(int x, int y) {
                        		this.x +=x;
                        		this.y +=y;
                        	}
                        
                        	public int getX() {
                        		return this.x;
                        	}
                        
                        	public int getY() {
                        		return this.y;
                        	}
                        	
                        	public void draw(Graphics  g) {
                        		 Graphics2D g2;
                                 g2 = (Graphics2D) g;
                                 g2.fillRect(this.getX(), this.getY(), 10, 10);
                        	}
                        
                        	public String toString(){
                        		return this.getX()+" "+this.getY();
                        	}
                        }
                        
                        package moves;
                        
                        import java.awt.Graphics;
                        
                        import javax.swing.JPanel;
                        
                        public class Plateau extends JPanel{
                        	Bloc bloc;
                        	
                        	public Plateau(Bloc bloc){
                        		this.bloc = bloc;
                        	}
                        
                        	@Override
                        	protected void paintComponent(Graphics g) {
                        		super.paintComponent(g);
                        		bloc.draw(g);
                        	}
                        	
                        	
                        }
                        






                        -
                        Edité par ukusan 25 août 2016 à 11:01:09

                        • Partager sur Facebook
                        • Partager sur Twitter
                          25 août 2016 à 18:09:28

                          Le listener est un thread, donc tu dois appliquer les changement de position directement dans le keyListener et donc dans une boucle de la class principale. A noter qu'une boucle infinie dans ta frame te bloque tout.
                          • Partager sur Facebook
                          • Partager sur Twitter

                          Problème de déplacement par un keyListener

                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                          • Editeur
                          • Markdown