2017-04-15 5 views
0

Für mein Projekt in der Schule müssen wir ein Spiel machen.Verschieben eines Objekts in Java (KeyPressed)

Ich versuche, ein Objekt mit den Pfeiltasten bewegen, aber nichts passiert, wenn ich es ausführen und drücken Sie eine der Tasten.

Habe ich vielleicht die addKeyListener(this); an der falschen Stelle implementiert?

package VoorbeeldSpel; 

import java.awt.Graphics; 
import java.awt.Image; 
import java.awt.event.*; 


import javax.swing.*; 

public class PlayPanel extends JPanel implements ActionListener, KeyListener { 

    private static final long serialVersionUID = 584263623777101573 L; 
    final static String IMAGE_FOLDER = "images/"; 
    final static String FILE_FOLDER = "files/"; 

    private Timer spelTimer = new Timer(50, this); // elke 1000 milliseconden zal een event gelanceerd worden 

    private JButton menuKnop; 
    private MijnProject mainVenster; 


    MusicPlayer music; 
    private Image ninjaImage; 
    private Image BackgroundImage; 

    public int pos_x, pos_y; 
    public int v_x, v_y; 

    private String inputText = ""; 

    public PlayPanel(MijnProject mainVenster) { 
     this.mainVenster = mainVenster; 

     menuKnop = new JButton("Menu"); 
     menuKnop.addActionListener(this); 

     this.add(new JLabel("We are playing ... ")); 
     this.add(menuKnop); 


     addKeyListener(this); 

     // Music player laden 
     music = new MusicPlayer("nyancat-loop.wav", true); 


     // Prentjes laden 
     ninjaImage = new ImageIcon(getClass().getResource(IMAGE_FOLDER + "ninja.png")).getImage(); 
     BackgroundImage = new ImageIcon(getClass().getResource(IMAGE_FOLDER + "Backgroundmenu.jpg")).getImage(); 

     spelTimer.start(); // hier starten we de gameloop 
    } 

    // we gaan init aanroepen nadat we dit JPanel aan het frame hebben toegevoegd 
    // op dit moment zijn de hoogte en breedte van het panel bepaald en kunnen we de pos_x en pos_y variabelen initialiseren als het midden van het scherm 
    public void init() { 
     addKeyListener(this); 
     v_x = ; 
     v_y = 0; 
     pos_x = getWidth()/2; 
     pos_y = getHeight()/2; 
     addKeyListener(this); 
    } 
    public void gameloop() { 

     pos_x += v_x; 
     pos_y += v_y; 
     repaint(); 

    } 

    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 

     g.drawImage(BackgroundImage, this.getWidth()/50, this.getHeight()/50, mainVenster.getWidth(), mainVenster.getHeight(), this); 
     g.drawImage(ninjaImage, pos_x, pos_y, 60, 60, this); 

     g.drawChars(inputText.toCharArray(), 0, inputText.length(), 25, getHeight()/2); 
    } 

    public void actionPerformed(ActionEvent ae) { 
     if (ae.getSource() == menuKnop) { 
      mainVenster.switchPanel(); 
      music.stop(); 
      spelTimer.stop(); // stoppen van het spel 

     } else if (ae.getSource() == spelTimer) { 

      gameloop(); 
      addKeyListener(this); 
      System.out.println("De volgende stap van het spel wordt uitgevoerd..."); 
     } 
    } 

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

    } 

    public void keyPressed(KeyEvent e) { 
     switch (e.getKeyCode()) { 
      case KeyEvent.VK_UP: 
       v_x = 0; 
       v_y = -5; 
      case KeyEvent.VK_DOWN: 
       v_x = 0; 
       v_y = 5; 
      case KeyEvent.VK_RIGHT: 
       v_x = 5; 
       v_y = 0; 
      case KeyEvent.VK_LEFT: 
       v_x = -5; 
       v_y = 0; 
     } 

     repaint(); 
    } 

    @Override 
    public void keyReleased(KeyEvent e) { 
     int Keycode = e.getKeyCode(); 
     switch (Keycode) { 
      case KeyEvent.VK_UP: 
       v_x = 0; 
       v_y = 0; 
      case KeyEvent.VK_DOWN: 
       v_x = 0; 
       v_y = 0; 
      case KeyEvent.VK_RIGHT: 
       v_x = 0; 
       v_y = 0; 
      case KeyEvent.VK_LEFT: 
       v_x = 0; 
       v_y = 0; 
     } 
     repaint(); 
    } 
} 
+0

Ich bezweifle, dass Sie Schlüssel-Listener auf jeder Schleife Iteration hinzufügen müssen, das ist zu viele Listener (oder wenn interner Code vernünftig ist, ignoriert es nur Ihre Bitten und haben sowieso nur einen Listener). –

Antwort

1

Dies ist wahrscheinlich, weil KeyListener erhält nur eine KeyEvent, wenn die Komponente fokussiert ist. Es gibt einige Vorschläge here, die das Problem für Sie lösen könnten; aber ich empfehle sie nicht, weil sie kludgy sind. Eine andere kludgy Lösung, die ich dort nicht sehe, ist, den Schlüsselhörer zu JFrame hinzuzufügen und dann setFocusable(false) und setFocusTraversalKeysEnabled(false) auf irgendwelchen Komponenten zu verwenden, die den Fokus wegnehmen könnten. Wichtige Listener sind besonders schwierig, wenn Sie Ihrer Benutzeroberfläche weitere Komponenten wie JButton und JTextField hinzufügen.

Eine bessere Lösung ist die Verwendung von Swing-Tastenbindungen, die keine Probleme beim Umgang mit dem Fokus-System haben. Here's ein Q & A, das einige der Motivation für sie erklärt, und es gibt eine tutorial here. Mit dem Flag WHEN_IN_FOCUSED_WINDOW können Sie sicherstellen, dass die Tastenbelegungen immer ausgelöst werden, unabhängig davon, welche Komponente den Fokus hat.

+0

Vielen Dank für Ihre Antwort, aber als ich herumalberte und versuchte herauszufinden, wie ich das Problem lösen konnte, sah ich etwas namens this.requestFocusable(); . Das hat den Trick für mich gemacht. Aber trotzdem vielen Dank für die Zeit, die Sie genommen haben, um mir zu helfen. –

+0

Ja, das ist eine der Lösungen, die ich nicht empfehlen. Wenn Sie zum Beispiel einen JButton zum Rahmen hinzugefügt haben und jemand darauf klickt, verliert der JPanel den Fokus und hört auf, wichtige Ereignisse erneut zu senden. – Radiodef

Verwandte Themen