2017-09-07 5 views
1

Bonjour, J'essaye de créer un jeu de casse-briques. Il existe une classe principale appelée Real_Main et une autre classe appelée Real_Create qui étend JPanel. J'ai l'impression que mon code est correct mais je n'arrive pas à déplacer mon rectangle avec les flèches droite et gauche. Quelqu'un pourrait-il me dire ce qui ne va pas? Et pourquoi avons-nous besoin d'une minuterie pour déplacer le rectangle?Rectangle ne bouge pas

import javax.swing.JFrame; 
public class Real_Main { 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     JFrame jf= new JFrame(); 

     Real_Create panel=new Real_Create(); 

     jf.setSize(500, 500); 
     jf.setVisible(true); 
     jf.setResizable(false); 
     jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     jf.add(panel); 

    } 

} 

Real_Create:

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 

import javax.swing.JPanel; 
import javax.swing.Timer; 

public class Real_Create extends JPanel implements KeyListener,ActionListener { 

    int baseX=200; 

    int ballX=250; 
    int ballY=250; 
    int delay=20; 

    Timer tim; 


    Boolean play=false; 


    public Real_Create(){ 

     addKeyListener(this); 
     setFocusable(true); 
     setFocusTraversalKeysEnabled(false); 

     tim=new Timer(delay,this); 

     tim.start(); 

    } 


    public void paint(Graphics g){ 

     //background 
     g.setColor(Color.black); 
     g.fillRect(1,1,500,500); 

     //baseplayer 

     g.setColor(Color.white); 
     g.fillRect(baseX, 430, 80, 10); 

     //ball 
     g.setColor(Color.green); 
     g.fillOval(ballX, ballY, 20, 20); 


     g.dispose(); 




    } 



    @Override 
    public void actionPerformed(ActionEvent arg0) { 
     // TODO Auto-generated method stub 
     tim.start(); 
     repaint(); 

    } 

    @Override 
    public void keyPressed(KeyEvent e) { 
     // TODO Auto-generated method stub 

     if(e.getKeyCode()== KeyEvent.VK_RIGHT){ 

      if(baseX >=420){ 

       baseX=420; 
      } 

      else{ 

       moveRight(); 
      } 

     } 

     if(e.getKeyCode()== KeyEvent.VK_LEFT){ 

      if(baseX <=0){ 

       baseX=0; 
      } 

      else{ 

       moveLeft(); 
      } 

     } 


    } 




    @Override 
    public void keyReleased(KeyEvent arg0) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void keyTyped(KeyEvent arg0) { 
     // TODO Auto-generated method stub 

    } 

public void moveRight(){ 

     play=true; 
     baseX+=10; 
    } 

    public void moveLeft(){ 

     play=true; 
     baseX-=10; 
    } 
} 

image du jeu:

Image from the game

+0

Je viens de tester votre code, et pour moi, déplacer le rect fonctionne parfaitement. C'est peut-être à cause de votre programme de capture d'écran, mais dans l'image, la fenêtre n'a pas de focus. Il doit avoir un focus pour que le keylistener fonctionne, essayez de cliquer sur la fenêtre. De plus, vous n'avez pas forcément besoin d'une minuterie pour déplacer le rect, pour le moment il ne fait que redessiner la fenêtre toutes les 20 ms, vous pouvez tout aussi bien appeler repeindre après une pression sur une touche, mais cela sera utile le ballon. – Gumbo

Répondre

0

Ce que vous faites affaire est imprévisible comportement Swing en raison de son manque de sécurité de fil. Selon la documentation "tout le code qui crée ou interagit avec les composants Swing doit s'exécuter sur le thread de répartition des événements". Pour ce faire, vous devez réécrire la création de votre GUI comme ceci:

public class Real_Main { 
    public static void main(String[] args) { 
    SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
     createAndShowGUI(); 
     } 
    }); 
    } 

    private static void createAndShowGUI() { 
    JFrame jf = new JFrame(); 
    Real_Create panel = new Real_Create(); 
    jf.setSize(500, 500); 
    jf.setVisible(true); 
    jf.setResizable(false); 
    jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    jf.add(panel); 
    } 
} 

Vous pouvez en savoir plus sur le sujet here.