2012-07-09 3 views
0

J'essaie de faire un jeu de pong mais ma pong ne bouge pas correctement pour une raison quelconque.Pong Le fond de la palette ne bouge pas lorsque la touche UP est pressée

Quand je frappe la flèche du bas vers le bas, il se déplace très bien. Mais quand j'appuie sur la touche fléchée HAUT, toute la palette devient plus longue vers le haut ... Si je redimensionne la fenêtre, la palette retourne à sa longueur normale à cette position. Si j'appuie sur la touche UP, elle continue à s'étendre vers le haut.

Je ne pense pas que sa ma logique de code, mais quelque chose effacer la palette déjà dessiné ... voici mon code,

Code pour Paddle:

import java.awt.*; 
import java.awt.event.KeyAdapter; 
import java.awt.event.KeyEvent; 
import java.awt.geom.Rectangle2D; 

import javax.swing.JPanel; 

public class Paddle extends JPanel { 

    int x; 
    int y; 
    int width; 
    int height; 

    Paddle(){ 
     this.x = 0; 
     this.y = 0; 
     this.height = 40; 
     this.width = 10; 
    } 

    Paddle(int x, int y, int width, int height){ 
     this.x = x; 
     this.y = y; 
     this.height = height; 
     this.width = width; 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.setColor(Color.BLACK); 
     g.fillRect(x, y, width, height); 
    } 

    public void moveDown(){ 
     this.y += 3; 
     repaint(); 
     System.out.println("h: " + height + " x: " + x + " y: " + y + " getW: " + getWidth() + " getH: " + getHeight()); 
    } 

    public void moveUp(){ 
     this.y -= 3; 
     repaint(); 
     System.out.println("h: " + height + " x: " + x + " y: " + y + " getW: " + getWidth() + " getH: " + getHeight()); 
    } 

    public int getX() { 
     return x; 
    } 

    public void setX(int x) { 
     this.x = x; 
    } 

    public int getY() { 
     return y; 
    } 

    public void setY(int y) { 
     this.y = y; 
    } 

    public int getWidth() { 
     return width; 
    } 

    public void setWidth(int width) { 
     this.width = width; 
    } 

    public int getHeight() { 
     return height; 
    } 

    public void setHeight(int height) { 
     this.height = height; 
    } 

} 

Code pour jeu entier:

import java.awt.*; 
import java.awt.event.KeyAdapter; 
import java.awt.event.KeyEvent; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Pong extends JFrame { 

    Pong() { 
     final Paddle p1Paddle = new Paddle(); 

     Paddle p2Paddle = new Paddle(); 
     p1Paddle.addKeyListener(new KeyAdapter() { 

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

       switch (e.getKeyCode()) { 
        case KeyEvent.VK_DOWN: 
         p1Paddle.moveDown(); 
         break; 
        case KeyEvent.VK_UP: 
         p1Paddle.moveUp(); 
         break; 
        default: 
         System.out.println("please press up or down"); 
       } 

      } 
     }); 

     setLayout(new BorderLayout()); 
     add(p1Paddle, BorderLayout.CENTER); 

     //only focused components can recieve key events... 
     p1Paddle.setFocusable(true); 
    } 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     JFrame frame = new Pong(); 
     frame.setTitle("Pong"); 
     frame.setSize(650, 300); 
     frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

} 

Toute aide à ce sujet ou des conseils de code général serait apprécié.

+0

Pourquoi avez-vous clearRect (0,0,650,300) codé en dur? –

+0

Je veux effacer toute la fenêtre et m'assurer que je n'ai manqué aucune partie de la pagaie ... mais la pagaie n'est pas affectée pour une raison quelconque. – user772401

+0

Pourquoi changez-vous la hauteur à chaque fois que vous bougez et que vous vous déplacez vers le bas? –

Répondre

1

Un peu difficile à dire à partir de l'extrait de code, mais, KeyListeners ne sont pas très fiables. Si le raccourci clavier est consommé (par l'interface utilisateur et l'implémentation sous-jacente), il se peut que vous ne soyez pas averti.

Essayez plutôt InputMap et ActionMap.

InputMap im = getInputMap(JTable.WHEN_FOCUSED_COMPONENT); 
ActionMap am = getActionMap(); 

KeyStroke downKey = KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0); 
KeyStroke upKey = KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0); 

im.put(downKey, "Action.down"); 
im.put(upKey, "Action.up"); 

am.put("Action.down", new DownAction()); 
am.put("Action.up", new UpAction()); 

Et voir où il vous prend ...

Mise à jour: Ahh, il est tellement évident maintenant, vous avez remplacé les méthodes largeur/hauteur x/y du panneau la disposition attente gestionnaire de les utiliser pour mettre en page le composant, mais pas vraiment fournir un gestionnaire de mise en page qui sait comment faire face.

BorderLayout ne se soucie pas de vous « taille » ou « exigences de position », il les remplacer avec ce qu'il pense que vous devriez être composant.

Ce que vous voulez faire est d'utiliser un gestionnaire de mise en page absolue à la place (null). En outre, vous ne voulez pas implémenter le X/Y, la gestion de largeur/hauteur, car cela est déjà pris en charge pour vous.

Donc.

Dans la classe Pong. Modifiez le gestionnaire de disposition de BorderLayout à null (également mettre à jour la méthode add (paddle) pour supprimer la référence BorderLayout, non requis, mais supprime la confusion).

Dans la classe Paddle, supprimer toutes les références à la x/y, largeur/hauteur, vous ne les avez pas besoin. Au lieu de cela, utilisez setBounds/setLocation.

public class Paddle extends JPanel { 

Paddle(){ 

     this(0, 0, 20, 40); 

} 

Paddle(int x, int y, int width, int height){ 

     setBounds(x, y, width, height); 

} 

@Override 
protected void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    g.setColor(Color.BLACK); 
    // The graphics context has already been translated to x/y for use, 
    // so we don't need to care about it 
    g.fillRect(0, 0, getWidth(), getHeight()); 
} 

public void moveDown(){ 

     setLocation(getX(), getY() + 3); 

} 

public void moveUp(){ 

     setLocation(getX(), getY() - 3); 

} 

}

et alto, cela fonctionne.

+0

Je n'ai aucun problème avec la réception des touches du clavier. Je ne sais pas pourquoi le dessin de la palette ne fonctionne pas correctement. J'ai joint tout mon code dans la question originale. Faites-moi savoir si vous voyez quelque chose de mal. Merci. – user772401

+0

Ah, c'est tellement évident :) – MadProgrammer

+0

wow! Merci, c'était parfait. J'ai quelques questions pour mieux comprendre. Comment se fait-il que dans le 1er constructeur de paddle vous utilisez "this (0,0,20,40)" mais dans l'autre vous utilisez des bornes définies. pourquoi pas "ceci (x, y, largeur, hauteur)" et vice versa - essayant juste de comprendre la raison de l'incohérence. et si je comprends bien, la raquette flotte actuellement sur la disposition "absolue", donc si je veux faire une détection de collision. Je devrais retourner à ma classe de pong. ou faites une classe jpanel 'table' où la pagaie et la balle sont libres de flotter à ... Merci beaucoup pour votre aide – user772401

Questions connexes