2017-09-06 4 views
1

J'essaie de déplacer un rectangle vers la gauche ou vers la droite en JFrame mais lorsque j'utilise les boutons fléchés, la barre ne bouge pas; c'est juste en train de s'étendre. Le rectangle est pour le type de jeu Brick Breaker.Problèmes de mouvement dans JFrame

public class main 
{ 

    public static void main(String[] args) 
    { 

    JFrame obj = new JFrame("Brick Breacker"); 
    obj.setBounds(50,50,1200,900); 
    obj.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    obj.setVisible(true);  
    Grafica grafica = new Grafica(); 
    obj.add(grafica); 
    } 
} 

public class Grafica extends JPanel implements ActionListener , KeyListener 
{ 
    Timer tm = new Timer(0,this); 
    boolean play = false; 
    int playerX = 550; 
    int playerXs = 0; 

    public Grafica() 
    { 
    tm.start(); 
    addKeyListener(this); 
    setFocusable(true); 
    setFocusTraversalKeysEnabled(false);  
    } 

    public void paint (Graphics g) 
    {     
    //paddle 
    g.setColor(Color.GREEN); 
    g.fillRect(playerX, 800, 145, 10); 

    //borders 
    g.setColor(Color.BLACK); 
    g.fillRect(0, 0, 5, 900); 
    g.fillRect(1180, 0, 5, 900); 
    g.fillRect(1200, 0, -1200, 5); 
    g.setColor(Color.RED); 
    g.fillRect(1200, 860, -1200, 5); 

    //ball 
    g.setColor(Color.blue);   
    g.fillOval(550,700, 26, 26); 
    } 

    public void actionPerformed(ActionEvent e) 
    {  
    playerX = playerX + playerXs; 
    repaint(); 
    } 

    public void keyTyped(KeyEvent e) 
    {     
    } 

    public void keyReleased(KeyEvent e) 
    { 
    playerXs = 0;  
    } 

    public void keyPressed(KeyEvent e) 
    { 
    int c = e.getKeyCode(); 
    if(c == KeyEvent.VK_RIGHT) 
    { 
     if(playerX > 850) 
     { 
      playerX = 850; 
     } else 
     { 
      moveRight(); 
     } 

    } 

    if(c == KeyEvent.VK_LEFT) 
    { 
     if(playerX > 850) 
     { 
      playerX = 850; 
     } else 
     { 
      moveLeft(); 
     } 
    } 
    } 

    public void moveRight() 
    { 
    play = true; 
    playerX+=20; 

    } 

    public void moveLeft() 
    { 
    play = true; 
    playerX-=20; 

    } 
} 
+2

Lisez https://docs.oracle.com/javase/tutorial/uiswing/painting/. Vous devez remplacer paintComponent, pas paint, et votre implémentation de cette méthode doit appeler super.paintComponent avant de faire quoi que ce soit d'autre. – VGR

Répondre

2

La raison pour laquelle cela ne fonctionne pas est que votre peinture() mise en œuvre ne voit pas clairement l'arrière-plan, à savoir que vous dessinez la barre verte à plusieurs reprises - en conservant les zones déjà peintes. Ainsi, il semble que la barre s'allonge au lieu de bouger.

Vous ne devriez pas remplacer la méthode paint(Graphics), mais plutôt la méthode paintComponent(Graphics), et vous devez invoquer super.paintComponent(Graphics):

public void paintComponent(Graphics g) 
{ 
    super.paintComponent(g); 
    // Now do your own painting here... 
} 

L'appel à la super implémentation de la classe vous donnera l'initialisation du contexte graphique, y compris le nettoyer avec la couleur de fond de votre JPanel.

Vous pouvez en savoir plus sur comment faire custom painting in Swing components here.

En outre, en note latérale, la limitation de portée vers la droite fonctionne, mais celle de gauche ne l'est pas - elle devrait vérifier playerX < 0. Et enfin, la façon dont vous implémentez votre boucle de jeu - en répondant aux entrées clés et repeindre - n'est pas optimale. Google pour 'java game loop' pour avoir des idées sur la façon de faire cela de façon plus efficace (très brièvement: Votre boucle de jeu devrait être indépendante de l'entrée et devrait mettre à jour la scène à intervalles réguliers. , ce qui devrait être reflété dans la prochaine mise à jour de la scène).