2016-06-06 5 views
1

J'ai écrit ce code pour pong très simple et tout fonctionne bien, sauf que je ne peux pas comprendre comment faire fonctionner KeyListener. Je ne sais pas où placer l'auditeur ou comment l'utiliser. Tous les autres conseils sont les bienvenus, je suis un noob alors s'il vous plaît expliquer à ce niveau.KeyListener ne répond pas dans JFrame

package pong; 

import java.awt.*; 
import java.awt.event.*; 
import java.util.*; 
import javax.swing.*; 

public class Pong extends JPanel implements KeyListener 
{ 
    int border = 15; 

    int enemyScore = 0; 
    int playerScore = 0; 

    int ballx = 248; 
    int bally = 170; 

    int playerx = 482; 
    double playery = 162; 
    int playeryy = 162; 

    int enemyx = 0; 
    double enemyy = 162; 
    int enemyyy = 162; 

    boolean gameReset = true; 

    boolean down; 
    boolean right; 

    //ball movement 
    private void moveBall() 
    { 
     Random rand = new Random(); 

     while (gameReset == true) 
     { 
      ballx = 240; 
      bally = 170; 
      down = rand.nextBoolean(); 
      right = rand.nextBoolean(); 
      gameReset = false; 
     } 

     if (right == true) 
     { 
      ballx++; 
     } 
     else 
     { 
      ballx--; 
     } 

     if (down == true) 
     { 
      bally++; 
     } 
     else 
     { 
      bally--; 
     } 

     if(bally == getHeight()-border) 
     { 
      down = false; 
     } 
     else if (bally == 0) 
     { 
      down = true; 
     } 

     if (playeryy < bally+14 && playeryy+59 > bally && ballx == 468) 
     { 
      right = false; 
     } 
     else if (ballx == getWidth()-border) 
     { 
      gameReset = true; 
      enemyScore ++; 
     } 
     else if (enemyyy < bally+14 && enemyyy+59 > bally && ballx == 13) 
     { 
      right = true; 
     } 
     else if (ballx == 0) 
     { 
      gameReset = true; 
      playerScore ++; 
     } 
    } 


    //enemy movement 
    private void moveEnemy() 
    { 
     if (right == false && bally > enemyy+8 && enemyy < 294) 
     { 
      enemyy += 0.8; 
      enemyyy = (int) enemyy; 
     } 
     else if (right == false && bally < enemyy+8 && enemyy > 0) 
     { 
      enemyy -= 0.8; 
      enemyyy = (int) enemyy; 
     } 
    } 

    //Drawing 
    @Override        
    public void paint(Graphics g) 
    { 
     super.paint(g); 
     g.fillRect(enemyx, enemyyy, 15, 60); 
     g.fillRect(playerx, playeryy, 15, 60); 
     g.fill3DRect(ballx, bally, 15, 15, true); 
     System.out.println("Enemy Score: " + enemyScore + " Player Score: "+ playerScore); 
    } 

    public static void main(String[] args) throws InterruptedException 
    { 

     JFrame frame = new JFrame("p0ng");      //makes new frame 
     frame.setSize(512,384);         //sets the size 
     frame.setVisible(true);         //makes it visble 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //allows it to sleep 
     Pong game = new Pong(); 
     frame.add(game); 

     while(true) 
     { 
      game.moveBall(); 
      game.moveEnemy(); 
      game.repaint(); 

      Thread.sleep(10); 
     }  
    } 

    @Override 
    public void keyTyped(KeyEvent ke) { 
     //not being used 
    } 

    //Player movement 
    @Override 
    public void keyPressed(KeyEvent e) 
    { 
     if (e.getKeyCode() == KeyEvent.VK_UP && playery < 294) 
     { 
      playery += .8; 
      playeryy = (int) playery; 
     } 
      else if (e.getKeyCode() == KeyEvent.VK_DOWN && playery > 0) 
     { 
      playery -= .8; 
      playeryy = (int) playery; 
     } 
     repaint(); 
    } 

    @Override 
    public void keyReleased(KeyEvent ke) { 
     //not being used 
    } 
} 
+1

Plus vous ajoutez le keylistener à votre cadre – Jens

+0

où dois-je ajouter cela? –

+0

Vous pouvez utiliser Frame.addKeyListener (jeu) – Jens

Répondre

1
public Pong(){ 
addKeyListner(this); 
} 

vous devez enregistrer votre panel au keyListner. vous pouvez utiliser la méthode addKeyListner pour le faire, puisque vous avez implémenté Keylistner au même class. vous pouvez utiliser le mot-clé this.Vous pouvez le faire au sein du constructor.

+0

* "c'est une mauvaise réponse." * - c'est ainsi. Bien que cela puisse fonctionner, il n'est pas fiable et, en règle générale, KeyListener est un mauvais choix, surtout quand des solutions plus fiables existent – MadProgrammer

+0

Je ne sais pas pourquoi dites-vous que KeyListener est un mauvais choix pouvez-vous me dire pourquoi . – Priyamal

+0

'KeyListener' est un mauvais choix car il n'est pas fiable. Il ne déclenchera des événements que lorsque le composant auquel il est enregistré est focalisable ET a le focus, puisque le code de l'OP ne rencontre aucune de ces contraintes, il continuera à ne pas fonctionner. Même si elles rendent le composant focalisable et sont capables de focaliser le composant, il ne faut pas grand-chose pour que le focus soit changé et le tout se casse à nouveau – MadProgrammer

2

Les autres conseils sont les bienvenus

  • Ne pas utiliser KeyListener, il est trop peu fiable, surtout quand il y a de meilleures options disponibles. Commencez par jeter un œil à How to Use Key Bindings
  • En règle générale, vous devez remplacer paintComponent au lieu de paint. Jetez un oeil à Performing Custom Painting et Painting in AWT and Swing
  • Vous violez les règles du fil unique de Swing et les conditions de course risquées entre votre logique de base et l'interface utilisateur. Jetez un oeil à Concurrency in Swing pour plus de détails et How to use Swing Timers pour une solution simple
  • Votre boucle "principale" est mal installée. Chaque itération de la boucle doit mettre à jour l'état actuel qui doit être peint. Vous ne devez pas utiliser les boucles "hold" pour "mettre en pause" l'état, mais utiliser if instructions pour bloquer les sections dont vous avez besoin/ne pas avoir besoin d'exécuter en fonction de l'état actuel
+0

Pouvez-vous me montrer à quoi cela ressemblerait avec ce code. Je ai du mal à comprendre comment utiliser la liaison de touches –

+0

[Exemple de liaisons de touches] (http://stackoverflow.com/questions/17984912/java-key-bindings-not-working/17984949#17984949) – MadProgrammer