2012-04-15 14 views
1

Ich habe begonnen, ein einfaches Plattformspiel in Java zu schreiben. Als Test habe ich dieses einfache Programm geschrieben, das ein Rechteck um das Applet bewegt, wenn Sie die Pfeiltasten drücken. Die Schlüsselereignisse haben überhaupt nicht geschossen. Hier ist der Code:Java - KeyListener Ereignisse nicht feuern

import java.applet.*; 
import java.awt.*; 
import java.awt.event.*; 
public class Game extends Applet implements Runnable, KeyListener 
{ 
    //setup data 
    Thread t; 
    Image buffimg; 
    Graphics draw; 
    Dimension dim; 

    //game variables 
    int charx = 400;//rectangles X and Y positions 
    int chary = 50; 
    boolean leftArrow = false; 
    public void init() 
    { 
     setSize(800, 500); 
     t = new Thread(this); 
     t.start(); 
     addKeyListener(this); 
    } 
    public void run() 
    { 
     while(true) 
     { 
      repaint(); 
      moveChar();//move the rectangle 
      try { 
       t.sleep(1000/30); 
      } catch (InterruptedException e) { ; } 
     } 
    } 
    public void keyPressed(KeyEvent e) 
    { 
     int k = e.getKeyCode(); 
     if(k == 37) 
     { 
      leftArrow = true; 
      charx--; 
     } 

    } 
    public void keyReleased(KeyEvent e) 
    { 
     if(e.getKeyCode() == 37) 
     { 
      leftArrow = false; 
     } 
    } 
    public void keyTyped(KeyEvent e) 
    { 
    } 
    public void moveChar() 
    { 
     //move rectangle on left arrow key press 
     if(leftArrow == true) 
     { 
      charx--; 
     } 
    } 
    public void paint(Graphics g) 
    { 
     g.drawRect(charx, chary, 100, 100); 
    } 
    public void update (Graphics g) 
    { 
     //double buffering 

     // initialize buffer 
     if (buffimg == null) 
     { 
      buffimg = createImage (this.getSize().width, this.getSize().height); 
      draw = buffimg.getGraphics(); 
     } 
     // clear screen in background 
     draw.setColor (getBackground()); 
     draw.fillRect (0, 0, this.getSize().width, this.getSize().height); 
     // draw elements in background 
     draw.setColor (getForeground()); 
     paint (draw); 
     // draw image on the screen 
     g.drawImage (buffimg, 0, 0, this); 
    } 
} 

Warum feuern sie nicht und wie soll ich das beheben?

+0

ich das Rechteck nach links withouth Probleme bewegen können. Sind Sie sicher, dass Sie die neueste Version Ihres Codes ausgeführt haben? – Rob

+0

Ja, könnte es ein Problem mit meinen Eclipse-Einstellungen sein? – Joe

+0

Danke Andrew, das scheint es behoben zu haben. – Joe

Antwort

4
this.requestFocusInWindow(); // end of init(), or better, in start() 
+0

+1 hmmm Repaint(); und dannnach moveChar(); ? – mKorbel

1

Ich habe Ihren Code versucht. Es funktioniert wie es sollte.

Das Problem besteht darin, dass Sie die Maus auf den Zeichenbereich drücken müssen, um sie zuerst zu fokussieren, bevor sie Ereignisse empfangen kann.

es automatisch zu tun, verwenden Sie diesen Befehl: requestFocusInWindow()

+0

Entschuldigung, während der Zeit, als ich Ihren Code getestet habe, hat Andrew die Antwort gepostet. –

+0

+1 für * "Ich habe Ihren Code getestet" * Ich habe mich nicht darum gekümmert, meines war nur eine Vermutung. ;) –

+0

cool, danke. Ich habe Ihren Beitrag auch neu eingestellt. :) –