import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
//die klasse erweitert JApplet weil's ein Applet ist,
//und implementiert KeyListener, weil man auf Tasten-Aktionen hören will.
public class MovingRectangle extends JApplet implements KeyListener{
private static final long serialVersionUID = 1L;
private int[] position; //x,y koordinaten des Rechtecks
private HashMap<Character,Boolean> keyStates; //zustände der tasten wasd
private JComponent canvas; //ein JComponent zum draufzeichnen
//diese methode hilft, die verschiedenen tastenkombinationen korrekt
//zu verknüpfen. bei "a+d" soll das rechteck genauso halten, als wenn keine
//taste gedrückt wäre
private static int getDirection(boolean a, boolean b){
return a^b?b?1:-1:0;
}
//der JComponent der alles zeichnet
private class AnimationComponent extends JComponent{
private static final long serialVersionUID = 1L;
@Override
public void paint(Graphics g){
//zwei rechtecke malen: ein großes weißes und ein kleins schwarzes
g.setColor(Color.WHITE);
g.fillRect(0,0,getWidth(), getHeight());
g.setColor(Color.BLACK);
g.fillRect(position[0],position[1],17,19);
}
}
//der Animationsthread
private class AnimationThread extends Thread{
@Override
public void run(){
while(true){
//kleines rechteck verschieben
position[0]+=getDirection(keyStates.get('a'),keyStates.get('d'));
position[1]+=getDirection(keyStates.get('w'),keyStates.get('s'));
//alles neuzeichnen
canvas.repaint();
//kurz warten
try{
sleep(10);
}catch(InterruptedException e){
break;
}
}
}
}
@Override
public void init(){
position=new int[2]; //starten bei (0,0)
keyStates=new HashMap<Character,Boolean>(); //alle tasten beim start als nicht gedrückt annehmen
for(char c:"wasd".toCharArray()){
keyStates.put(c,false);
}
addKeyListener(this); //KeyListener anhängen. In diesem fall sich selbst.
canvas=new AnimationComponent(); //Komponente zum malen hinzufügen
this.getContentPane().add(canvas);
new AnimationThread().start(); //Animationsthread starten
}
@Override public void start(){} //unbenutztes zeugs...
@Override public void stop(){}
@Override public void destroy(){}
//zwei methoden des Listeners markieren die tasten als gedrückt bzw losgelassen,
//wenn die entsprechenden ereignisse ankommen.
@Override
public void keyPressed(KeyEvent e) {
if(keyStates.keySet().contains(e.getKeyChar())){
keyStates.put(e.getKeyChar(),true);
}
}
@Override
public void keyReleased(KeyEvent e) {
if(keyStates.keySet().contains(e.getKeyChar())){
keyStates.put(e.getKeyChar(),false);
}
}
@Override public void keyTyped(KeyEvent arg0) {} //noch mehr unbenutztes zeugs...
}