2015-07-15 3 views
-3

(Le jeu n'est pas encore terminé mais néanmoins) L'utilisation de l'entrée au clavier ne fait rien, je crois que c'est dû au fait que KeyListener n'est pas correctement défini. Voici mon code: MainClass:Entrée clavier simple Pong Game

import java.awt.Color; 
import java.awt.Graphics; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 


public class mainClass extends JComponent{ 
    private static ballAndGameplay ball; 
    private static calculateDrawPos blocks; 

    public static void main(String[] a) { 
     JFrame window = new JFrame("PONG"); 
     window.setSize(1280,720); 
     window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     mainClass mc = new mainClass(); 
     window.getContentPane().add(new mainClass()); 
     window.setVisible(true); 
     ball = new ballAndGameplay(630,300,5,5); 
     blocks = new calculateDrawPos(false,false,false,false); 
     mc.addKeyListener(blocks); 
     while (true){ 
      blocks.moveBlocks(); 
      ball.moveBall(); 
      mc.removeAll(); 
      mc.paint(window.getGraphics()); 
      try{ 
       Thread.sleep(10); 
      } 
      catch (Exception e){ 

      } 
     } 
    } 
    public void paint(Graphics g) { 
     g.setColor(Color.BLACK); 
     g.fillRect (-10, -10, 1300, 740); 
     g.setColor(Color.WHITE); 
     g.fillRect (10, blocks.PlayerOneY, 25, 125); //left player 
     g.fillRect (1230, blocks.PlayerTwoY, 25, 125); //right player 
     g.fillRect (638, -10, 4, 740); //middle line 
     g.fillRect (ball.ballX, ball.ballY, 20, 20); //ball 
    } 

} 

calculateDrawPos:

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


public class calculateDrawPos extends KeyAdapter implements KeyListener { 
    int PlayerOneY=275; 
    int PlayerTwoY=275; 
    boolean wPressed; 
    boolean sPressed; 
    boolean upPressed; 
    boolean downPressed; 
    public calculateDrawPos (boolean a, boolean b, boolean c, boolean d) { 
     this.wPressed=a; 
     this.sPressed=b; 
     this.upPressed=c; 
     this.downPressed=d; 
    } 

    public void keyPressed(KeyEvent event) { 
     int keyCode = event.getKeyCode(); 
     if (keyCode == KeyEvent.VK_W); 
     { 
      wPressed=true; 
     } 
     if (keyCode == KeyEvent.VK_S); 
     { 
      sPressed=true; 
     } 
     if (keyCode == KeyEvent.VK_UP); 
     { 
      upPressed=true; 
     } 
     if (keyCode == KeyEvent.VK_DOWN); 
     { 
      downPressed=true; 
     } 
    } 

    public void keyReleased(KeyEvent event) { 
     int keyCode = event.getKeyCode(); 
     if (keyCode == KeyEvent.VK_W); 
     { 
      wPressed=false; 
     } 
     if (keyCode == KeyEvent.VK_S); 
     { 
      sPressed=false; 
     } 
     if (keyCode == KeyEvent.VK_UP); 
     { 
      upPressed=true; 
     } 
     if (keyCode == KeyEvent.VK_DOWN); 
     { 
      downPressed=true; 
     } 
    } 
    public void moveBlocks(){ 
     if (wPressed==(true)){ 
      PlayerOneY-=5; 
     } 
     if (sPressed==(true)){ 
      PlayerOneY+=5; 
     } 
     if (upPressed==(true)){ 
      PlayerTwoY-=5; 
     } 
     if (downPressed==(true)){ 
      PlayerTwoY+=5; 
     } 
    } 
} 

ballAndGameplay:

import java.util.Random; 

public class ballAndGameplay { 
    private static Random rand; 
    int ballX; 
    int ballY; 
    int ballXVelocity; 
    int ballYVelocity; 
    public ballAndGameplay (int a, int b, int c, int d) { 
     rand = new Random(); 
     this.ballX=a; 
     this.ballY=b; 
     this.ballXVelocity=c; 
     this.ballYVelocity=d; 
    } 
    public void moveBall() { 

     boolean pointFinished = (ballX <= -20 || ballX >= 1280); 


     if (ballY <= 20 || ballY >= 700) { 
      ballYVelocity*=-1; 
     } 
//  if ((ballY >= PlayerOneY && ballY <= PlayerOneY+125 && ballX <= 35) || (ballY >= PlayerTwoY && ballY <= PlayerTwoY+125 && ballX >= 1245)){ 
//   ballXVelocity*=-1.2; 
//  } 


     if (pointFinished==(true)){ 
      try{ 
       Thread.sleep(500); 
      } 
      catch (Exception e){ 

      } 
      ballX=630; 
      ballY=300; 
      getBallX(); 
      getBallY(); 
     } 
     ballX+=ballXVelocity; 
     ballY+=ballYVelocity; 
//  System.out.println("ballX: "+ballX+" ballY: "+ballY+" ballXVelocity: "+ballXVelocity+" ballYVelocity: "+ballYVelocity); 
    }  
    public int getBallX(){ 
     if (ballX != 630){ 
      return ballXVelocity; 
     } 
     int side = rand.nextInt(2); 
     int number = rand.nextInt(5); 
     number+=4; 
     if (side==0){ 
      ballXVelocity=-1*number; 
     } 
     else if (side==1){ 
      ballXVelocity=1*number; 
     } 
     return ballXVelocity; 

    } 
    public int getBallY(){ 
     if (ballY != 300){ 
      return ballYVelocity; 
     } 
     int side = rand.nextInt(2); 
     int number = rand.nextInt(5); 
     number+=4; 
     if (side==0){ 
      ballYVelocity=-1*number; 
     } 
     else if (side==1){ 
      ballYVelocity=1*number; 
     } 
     return ballYVelocity; 
    } 
} 
+1

1) Utilisez les liaisons de touches comme [toute recherche correcte de ce site et les balises Swing et KeyListener vous le dira] (http://stackoverflow.com/questions/tagged/java+swing+keylistener?sort = votes & pageSize = 15). 2) Remplacer et dessiner dans la méthode 'paintComponent' de JComponent pas dans la méthode' paint', si ce n'est que pour éviter les graphiques saccadés que vous obtiendrez en utilisant de la peinture. 3) N'oubliez pas d'appeler la méthode 'paintComponent' du super dans votre override pour effacer l'ancienne image de la balle. 4) Lisez les tutoriels et les questions similaires sur ce site pour les problèmes futurs car ils vous conduiront rarement mal. 5) *** JAMAIS *** appelez 'paint' directement –

+1

Modifier, désolé, mais plus je regarde votre code, plus je vois que vous faites beaucoup de devinettes, y compris faire des suppositions sauvages, comme la façon dont vous Fais ton dessin, et ça ne va que t'embêter. S'il vous plaît, pour votre propre plaisir, essayez d'éviter cela et suivez plutôt les exemples qui se trouvent ici et dans les tutoriels. En outre, utilisez Key Bindings, pas un KeyListener, encore une fois que le [liens dans ma recherche] (http://stackoverflow.com/questions/tagged/java+swing+keylistener?sort=votes&pageSize=15) vous le dira. –

+1

Au moins scrap "mainClass" puisque c'est là que se trouvent la plupart de vos problèmes. Envisagez d'utiliser un Swing Timer à la place d'une boucle 'while (true)' car cette dernière risque de lier le thread d'événement Swing, gelant ainsi votre application. –

Répondre

3

Vous avez écrit

mainClass mc = new mainClass(); 
    window.getContentPane().add(new mainClass()); 

Cela signifie que le mainClass que vous avez ajouté à votre fenêtre n'est pas le même que les références mc. Donc toutes ces opérations que vous faites à mc n'apporteront aucun changement à votre fenêtre.

Vous pouvez essayer d'écrire

mainClass mc = new mainClass(); 
    window.getContentPane().add(mc); 

à la place.

+0

J'ai essayé mais ça n'a pas fonctionné? – Tom

+0

Est-ce que vous me demandez de déboguer votre code pour vous? –

+0

Je demande des conseils sur la façon de faire fonctionner mon code dans le sens de faire bouger les blocs de l'utilisateur pong car l'entrée du clavier échoue, et votre recommandation n'a pas changé la façon dont le jeu a joué, même si était une correction de bogue. – Tom

1

Questions:

  • Un KeyListener ne fonctionne que sur un composant qui a le focus actuel.
  • Votre ajouter votre KeyListener à un JComponent, un composant qui par défaut est même pas en mesure de gagner la mise au point (contrairement à un JButton, JTextField, et d'autres composants qui permettent généralement l'interaction du clavier.)
  • Une solution à court terme est Pour rendre votre JComponent, la variable mc peut être mise au point en appelant le mc.setFocusable(true);, puis en mettant l'accent sur le système en appelant le mc.requestFocusInWindow();.
  • Mais après avoir dit cela, vous êtes encore loin préférable d'utiliser Key Bindings

Autres questions:

  • Override et dessiner dans la méthode paintComponent du JComponent pas la méthode de peinture, si seulement pour éviter la graphiques saccadés que vous obtiendrez en utilisant de la peinture.
  • N'oubliez pas d'appeler la méthode paintComponent du superclave dans votre override pour effacer l'ancienne image de la balle.
  • N'utilisez jamais un objet Graphics obtenu à partir d'un composant en appelant getGraphics() dessus car l'objet ainsi obtenu deviendra invalide ou passera à zéro au fil du temps menant à des graphismes invalides ou pire.
  • N'appelez jamais la méthode paint(...) ou paintComponent(...) directement comme vous le faites.
  • Au lieu d'utiliser des graphiques passifs selon le Swing graphics tutorials que je vous invite à lire.
  • Utilisez une boucle Swing Timer à la place d'une boucle while (true) car votre boucle while (true) risque d'attacher le thread d'événement Swing, ce qui gèle votre application.