KeyEvent ...

Luk10

Top Contributor
Hallo,

Folgendes Programm:

Java:
public class GamePanel extends JPanel implements Runnable, KeyListener {

  private boolean game_running;
  private long delta = 0;
  private long last = 0;
  private long fps = 0;
  
  private boolean up;
  private boolean down;
  private boolean left;
  private boolean right;
  private double speed;
  
  ArrayList<Grafiken> bilder;
  Grafiken grafik;
  
  public static void main (String[] args) {
      new GamePanel(600, 400);
    }
  
  public GamePanel (int w, int h) {
      game_running = true;
      speed = 50.0;
      //GUI-Einrichten
      this.setPreferredSize(new Dimension(w, h));
      JFrame frame = new JFrame("CellSim");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.addKeyListener(this);
      frame.add(this);
      frame.pack();
      
      initialisieren();
      
      frame.setVisible(true);
    }
    
    private void initialisieren () {
        
        last = System.nanoTime();
        bilder = new ArrayList<Grafiken>();
        BufferedImage[] cell = this.loadPics("F:/Pics/greenCell_1.png", 4);
        grafik = new Grafiken (cell, 200, 150, 100, this);
        bilder.add(grafik);
        
        Thread t = new Thread(this);
        t.start();
    }
    
    public void run () {
        while (game_running) {
            
            doTime();
            checkKeys();
            doLogic();
            moveObjects();
            
            repaint();
            
            try {
                Thread.sleep(10);
            } catch (Exception ex) { }
        }
    }
    private void doTime () {
        delta = System.nanoTime() - last;
        last = System.nanoTime ();
        
        fps = ((long) 1e9)/delta;
    }
    @Override
    public void paintComponent (Graphics g) {
        super.paintComponent(g);
        
        g.setColor(Color.blue);
        g.drawString("FPS: " + Long.toString(fps), 0, 10);
        
        if (bilder != null) {
            for (Drawable draw : bilder) {
                draw.drawObjects(g);
            }
        }
    }
    
    public void doLogic () {
        for (Moveable mov : bilder) {
            mov.doLogic(delta);
        }
    }
    public void moveObjects () {
        for (Moveable mov : bilder) {
            mov.move(delta);
        }
    }
    private BufferedImage[] loadPics(String path, int pics) {
        BufferedImage[] meineBilder = new BufferedImage[pics];
        BufferedImage source = null;
        
        URL pic_url = getClass().getClassLoader().getResource(path);
        
        try {
            source = ImageIO.read(new File(path));
        } catch (Exception ex)  { }
        
        for (int x = 0; x < pics; x++) {
            meineBilder[x] = source.getSubimage(x*source.getWidth()/pics, 0, 
            source.getWidth()/pics, source.getHeight());
        }
        return meineBilder;
    }
    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_W) {
            up = true;
            System.out.println("Pressed up");
        }
        if (e.getKeyCode() == KeyEvent.VK_S) {
            down = true;
        }
        if (e.getKeyCode() == KeyEvent.VK_A) {
            left = true;
        }
        if (e.getKeyCode() == KeyEvent.VK_D) {
            right = true;
        }
    }
    public void keyReleased (KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_W) {
            up = false;
        }
        if (e.getKeyCode() == KeyEvent.VK_S) {
            down = false;
        }
        if (e.getKeyCode() == KeyEvent.VK_A) {
            left = false;
        }
        if (e.getKeyCode() == KeyEvent.VK_D) {
            right = false;
        }
    }
    public void keyTyped (KeyEvent e) {
    }
    private void checkKeys () {
        if (up) {
            grafik.setdx(-speed);
        }
        if (down) {
            grafik.setdx(speed);
        }
        if (right) {
            grafik.setdy(speed);
        }
        if (left) {
            grafik.setdy(-speed);
        }
        if (!up && !down) {
            grafik.setdx(0);
        }
        if (!left && !right) {
            grafik.setdy(-speed);
        }
    }
}

Java:
public class Grafiken extends Rectangle2D.Double implements Drawable, Moveable {
 
  private long verzoegerung;
  private long animation;
  private int aktuellesPic;
  
  protected double dx;
  protected double dy;
  
  GamePanel panel;
  BufferedImage[] pics;
  
  public Grafiken (BufferedImage[] i, double x, double y, long verzoegerung, GamePanel p) {
      pics = i;
      this.x = x;
      this.y = y;
      this.verzoegerung = verzoegerung;
      this.width = pics[0].getWidth();
      this.height = pics[0].getHeight();
      panel = p;
    }
    
    public void drawObjects (Graphics g) {
        g.drawImage(pics[aktuellesPic], (int) x, (int) y, null);
    }
    public void doLogic (long delta) {
        animation += (delta/1000000);
        
        if (animation > verzoegerung) {
            animation = 0;
            doAnimation();
        }
    }
    public void move (long delta) {
        
        if (dx != 0) {
            x += dx*(delta/1e9);
        }
        if (dy != 0) {
            x =+ dy*(delta/1e9);
        }
        //System.out.println("Did move");
    }
    
    private void doAnimation () {
        aktuellesPic++;
        
        if (aktuellesPic >= pics.length) {
            aktuellesPic = 0;
        }
    }
    public void setdx (double d) {
        dx = d;
        //System.out.println("Set up");
    }
    public void setdy (double d) {
        dy = d;
    }
    public double getdx () {
        return dx;
    }
    public double getdy () {
        return dy;
    }    
}

Wieso passiert nichts wenn ich das w,a,s,d drücke?

Finde den Fehler nicht ...

Danke Luk
 

Schandro

Top Contributor
ich denke mal, das das GamePanel den Focus hat und nicht das frame, an das du den KeyListener gehängt hast. Deswegen kommen überhaupt keine Events an.
=> schreib mal
Code:
this.addKeyListener(this);
in den Konstruktor, geb aber keine Garantie das es dann funktioniert, habs net selber ausprobiert..
 

Schandro

Top Contributor
benutz doch mal den Debugger bzw. schreib einfach ein paar
Code:
System.out.println(...);
rein. Wird keyReleased usw.. überhaupt aufgerufen? Wenn ja: wird paintComponent aufgerufen um das Gemalte zu aktualisieren? Wenn ja: ändern sich die Variablen anhand paintComponent das Bild malt oder sind es immer die gleichen? ...

aufjedenfall felht ein repaint(); am Ende der KeyListener Methoden..
 
G

Gast2

Gast
Ich würde keinen Listener anlegen sondern die ActionMap überschreiben...
Des Weiteren tust repaint im falschen Thread aufrufen...
 
Zuletzt bearbeitet von einem Moderator:
G

Gast2

Gast
Hier ein Beispiel:

Java:
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;

import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;


public class KeyPanel extends JPanel{

	public KeyPanel(){
		super();
		createKeyAction("w", KeyStroke.getKeyStroke(KeyEvent.VK_W, 0), new WAction(), this);
	}
	
	public static class WAction extends AbstractAction{

		@Override
		public void actionPerformed(ActionEvent e) {
			System.out.println("doW Action");
			
		}
		
	}
	
    private void createKeyAction(String actionMapKey, KeyStroke keyStroke, Action action, JComponent component) {
    	component.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(keyStroke, actionMapKey);
    	component.getActionMap().put(actionMapKey, action);
    }
    
	public static void main(String[] args) {
		JFrame frame = new JFrame("Key Test");
		frame.add(new KeyPanel());
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setSize(200,200);
		frame.setVisible(true);
	}
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M KeyEvent ohne Fokus konsumieren AWT, Swing, JavaFX & SWT 1
Monokuma KeyEvent in der Canvas Klasse AWT, Swing, JavaFX & SWT 0
F AWT awt KeyEvent - Zeichen direkt nach Eingabe löschen AWT, Swing, JavaFX & SWT 2
Bluedaishi JavaFX JFoenix TextField KeyEvent AWT, Swing, JavaFX & SWT 2
L JavaFX ASCII Zeichen /char von KeyEvent erhalten AWT, Swing, JavaFX & SWT 5
Wurstkopp JavaFX JavaFX KeyEvent kein Zahlencode um unbekannte Mediatasten auszuwerten? AWT, Swing, JavaFX & SWT 0
B JavaFX Wo liegt mein Gedankenfehler ??? KeyEvent geht nicht ... AWT, Swing, JavaFX & SWT 8
S Swing JDialog mit KeyEvent als Rückgabe AWT, Swing, JavaFX & SWT 1
B JavaFX KeyEvent und Canvas draw Problem AWT, Swing, JavaFX & SWT 9
dat_vin KeyEvent jTextField AWT, Swing, JavaFX & SWT 12
A Swing KeyEvent mit KeyListener und KeyAdapter kürzer schreiben AWT, Swing, JavaFX & SWT 7
B Event Handling KeyEvent für "+"-Tase auf dem Numpad? AWT, Swing, JavaFX & SWT 2
R Integer to KeyEvent AWT, Swing, JavaFX & SWT 2
sylo STRG + TAB KeyEvent abfangen AWT, Swing, JavaFX & SWT 6
earlgrey_tea KeyEvent reagiert nicht auf Eingabe ("Pausentaste") AWT, Swing, JavaFX & SWT 11
M KeyEvent, KEY_TYPED & backspace/left/right. AWT, Swing, JavaFX & SWT 3
H KeyEvent für JFrame AWT, Swing, JavaFX & SWT 3
S Spezielles KeyEvent AWT, Swing, JavaFX & SWT 6
Luma AWTEventListener KeyEvent und KEY_TYPED AWT, Swing, JavaFX & SWT 5
P KeyEvent methode an actionEvent methode weiterleiten AWT, Swing, JavaFX & SWT 5
A KeyEvent bei TAB-Druck AWT, Swing, JavaFX & SWT 10
J KeyEvent bei JTable mehrmals hintereinander ausführen AWT, Swing, JavaFX & SWT 9
J KeyEvent STRG+l, CTRL_DOWN_MASK AWT, Swing, JavaFX & SWT 7
I Pfeiltasten für KeyEvent AWT, Swing, JavaFX & SWT 4
G Windows Taste in KeyEvent? AWT, Swing, JavaFX & SWT 4
M KeyEvent - Programm mit ESC beenden AWT, Swing, JavaFX & SWT 7
H KeyEvent Leerzeichen und Backspace funktioren nicht! HILFE! AWT, Swing, JavaFX & SWT 2
S KeyEvent im JPanel AWT, Swing, JavaFX & SWT 3
G KeyEvent - Probleme AWT, Swing, JavaFX & SWT 6
G Suche einen KeyEvent für die Taste "ä" AWT, Swing, JavaFX & SWT 7

Ähnliche Java Themen

Neue Themen


Oben