# Applets - mehrere Tasten gleichzeitig abfragen



## mryoyoyo700 (26. Okt 2012)

Ich fang grad bissl mit Java an, und wollte ein Spiel machen, in dem man mit den Pfeiltasten ein Rechteck bewegt. Leider wird immer nur eine Taste ausgewertet. Das Rechteck kann sich also nicht in x und y Richtung bewegen....

Danke im Vorraus 


```
import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class MainCode extends Applet implements Runnable, KeyListener {

	private static final long serialVersionUID = 1L;
	public static int width = 500, height = 500;
	public static float maxFrameRate = 60.0f;

	Image backbuffer;
	Graphics backb;

	int x;
	int y;
	int speed = 4;

	public void init() {
		this.addKeyListener(this);
		new Thread(this).start();

	}

	public void run() {

		backbuffer = this.createImage(width, height);
		backb = backbuffer.getGraphics();
		backb.setColor(Color.white);

		while (true) {
			repaint();
			try {
				Thread.sleep((long) (1000.0f / maxFrameRate));
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

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

		backb.setColor(Color.black);
		backb.fillRect(0, 0, width, height);
		backb.setColor(Color.red);
		backb.fillRect(x, y, 10, 50);

		g.drawImage(backbuffer, 0, 0, this);

	}

	public void keyTyped(KeyEvent e) {
	}

	public void keyPressed(KeyEvent e) {

		int kc = e.getKeyCode();

		if (e.getKeyCode() == KeyEvent.VK_LEFT)
			x -= speed;
		if (e.getKeyCode() == KeyEvent.VK_RIGHT)
			x += speed;
		if (e.getKeyCode() == KeyEvent.VK_UP)
			y -= speed;
		if (e.getKeyCode() == KeyEvent.VK_DOWN)
			y += speed;
	}

	public void keyReleased(KeyEvent e) {
	}

}
```


----------



## Marco13 (26. Okt 2012)

Es gibt da viele Möglichkeiten, insbesondere wenn Threads und repainting und ggf. weitere Aktionen zusammenkommen, aber die pragmatischste und auf dieser Ebene einleuchtendste wäre vermutlich, zwei Variablen zu machen: speedX und speedY. Wenn man links/rechts drückt, wird speedX auf +/-speed gesetzt (und wenn man losläßt, wieder auf 0). Genauso für oben/unten mit speedY. In der Schleife werden dann der aktuelle speedX und speedY auf x bzw. y draufaddiert. 

Applet ist übrigens AWT und eigentlich veraltet, man sollte eher Swing (JApplet) verwenden. Da spart man sich auch den Krampf mit dem BackBuffer. Allerdings sollte das Zeichnen in beiden Fällen von einer eigenen Component gemacht werden, die nur im Applet liegt, aber... es ist ja der erste Versuch. Schau vielleicht trotzdem mal sowas wie http://www.java-forum.org/spiele-multimedia-programmierung/54795-quaxli-2d-spiele-tutorial.html


----------



## mryoyoyo700 (27. Okt 2012)

Danke schon mal für die Hilfe. Es funktioniert im Applet Viewer von Eclipse schon mal gut,
aber wenn ich es im Browser ausführe, hat das Applet keinen Focus ;(

Weiß wer woran das liegt?


----------



## Marco13 (27. Okt 2012)

"Die Ursache" ist schwer zu benennen. Einmal ins Applet reinklicken sollte schon reichen. Man kann ggf. mal versuchen, ob es durch ein
requestFocusInWindow();
in der 'start'-Methode schon behoben ist.


----------

