Partage
  • Partager sur Facebook
  • Partager sur Twitter

déplacer un objet

    11 juillet 2021 à 5:11:06

    Bonjour j'ai un soucis lorsque j'essaie de faire bouger un objet dessiner sur mon un JPanel à l'aide d'un Keylistener. Tout fonctionne parfaitement mais le soucis c'est qu'il faut que j'appuis plusieurs fois pour que l'objet se déplace hors j'aimerai qu'il bouge en continue dès que j'ai appuyé sur une touche. Voici l'ensemble de mon code : 

    public class Main extends JFrame {
        private static final long serialVersionUID = 1L;
        private Scene scene;
    
        Main(){
            scene = new Scene();
            setTitle("Game_simulation");
            setSize(600,300);
            setVisible(true);
            setLocationRelativeTo(null);
            setResizable(false);
    
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            getContentPane().add(scene);
        }
        public static void main(String[] args) {
            new Main();
        }
    
    }
    
    class Scene extends JPanel implements KeyListener {
        private Rect rect;
        private Bullet bullet;
        private Field field;
    
        public Scene(){
            addKeyListener(this);
            setFocusable(true);
        
            rect = new Rect(100,172,20,50);
            field = new Field(0,223,600,40);
            System.out.println(bullet.getPx());
        }
    
    
        //Objects in this Class don't move on their own
        //I'll implement all methods responsible to animate the Objects
        public void paintComponent(Graphics g){
    
            g.setColor(Color.BLACK);//Background
            g.fillRect(0,0,600,300);//Background
    
            g.setColor(Color.BLUE);//Le rect soit le joueur
            g.fillRect(rect.getPx(), rect.getPy(), rect.getL1(), rect.getL2());//Le rect soit le joueur
    
        }
    public void move_right (){
                int c = 5;
                int x = rect.getPx();//
                x = x + c;
                rect.setPx(x);//Updating ball position
                if(x>600- rect.getL1()*2)
                    rect.setPx(40);
    
            try {
                Thread.sleep(10);
                repaint();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    
        }
    public void move_left (){
            int c = 5;
            int x = rect.getPx();//
            x = x - c;
            rect.setPx(x);//Updating ball position
            if(x<40)
                rect.setPx(560);
    
            try {
                Thread.sleep(10);
                repaint();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    
        }
    
     @Override
        public void keyTyped(KeyEvent e) {
    
        }
    
        @Override
        public void keyPressed(KeyEvent e) {
    
            System.out.println(e.getKeyCode());
    
           if(e.getKeyCode()==68)
               move_right();
            if(e.getKeyCode()==81)
                move_left();
    
    
        }
    
        @Override
        public void keyReleased(KeyEvent e) {
    
        }
    }
    
    class Rect {
        int l1,l2;
        int px;
        int py;
    
        public Rect(int x, int y, int l1, int l2){
            this.px = x;
            this.py = y;
            this.l1 = l1;
            this.l2 = l2;
        }
    
    
    
        int getL1(){
            return this.l1;
        }
    
        int getL2(){
            return this.l2;
        }
    
        void setPx(int x){
            this.px = x;
        }
    
        int getPx(){
            return this.px;
        }
    
        int getPy(){
            return this.py;
        }
    
    }
    
    
    

    -
    Edité par One_Shot 11 juillet 2021 à 5:12:27

    • Partager sur Facebook
    • Partager sur Twitter
      11 juillet 2021 à 20:16:15

      Pour ce genre de choses, il faut retenir quelle touche est appuyée (gauche, droite ou aucune), et toutes les x millisecondes, faire bouger l'élément en fonction des touches appuyées, puis repeindre.

      Bref il faut un timer. Swing en propose.

      Il ne faut pas espérer faire marcher une fréquence trop forte par contre. Ça ne rend pas aussi bien qu'un moteur de rendu pour jeux vidéos, le concept de repaint() n'étant pas synchrone au moment où il est appelé.

      • Partager sur Facebook
      • Partager sur Twitter

      déplacer un objet

      × 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