Info
Irgendwie hat man während der Pandemie doch etwas zu viel Zeit. Und da ich ja viel Tippe, wollte ich ein Spiel schreiben, mit dem man sich ein wenig verbessern kann... wobei da weniger das Tippen, als mehr das ausprobieren im Vordergrund war.
Idee
Die Idee war, ein sehr simples Game in Java zu schreiben, welches zufällige Worte auf einen herunterfallen lässt (ähnlich Space invaders). Jedes Wort muss man rechtzeitig tippen, bevor das wort unten "aufschlägt" ![]()
Dann sollte es noch sowas wie verschiedene Level geben, damit sich der Schwierigkeitsgrad anpasst.
Dann noch ein wenig Effekte, Sounds etc. und fertig
naja, fast.
Implementierung
Das ganze ist erstaunlich einfach gewesen. Komplizierter war es schon, schwierige Worte irgendwo aus dem Internet zu kramen. Und auf soundbible nach vernünftigen Soundeffekten zu suchen.
Eigentlich besteht das Programm aus 2 Klassen:
- die
MainFrame-Klasse, ist auch ausführbar. Startet das Game Window und fügt die 2. Klasse hinzu - die 2. Klasse ist
GamePanel- das zeichnet den Spielbereich.
Dann gibts noch ein paar Objekte, die dargestellt werden sollen. Diese implementieren ein Interface namens Obj:
void draw(Graphics2D g);
//returns true, if it needs to be deleted
boolean animate();
int getX();
int getY();
}
im GamePanel läuft dann ein Timer, der alle 15ms repaint() aufruft. In der Paint-Methode wird dann über alle Obj iteriert und für alle draw aufgerufen.
Dann wird auch noch ein "Drumrum" ausgegeben, wie der aktuelle Score, wie viele Schiffe es noch zu zerstören gilt etc.
die Animationen
Im Mainframe gibt es eine Funktion, die - auch über einen SwingTimer gesteuert - die animate() Methode für alle Obj im Gamepanel aufruft. Liefert dies true zurück, wird das entsprechende Object vom Gamepanel entfernt, weil die Animation beendet ist und damit das Objekt nicht mehr benötigt wird.
Jedes Objekt macht seine Animationen "selbst", d.h. normalerweise kennt ein Obj keine anderen. Nur der "Shot", also das Projektil, was auf die Bösen Schiffe geschossen wird, kennt sein Zielobjekt und "animiert sich dem Ziel entgegen" sozusagen
Das ist auch der Grund, warum die Obj Getter für X und Y haben.
ein Beispiel für die Animation ist Star - das sind die Sternchen, die im Hintergrund rumschwirren (von denen werden 150 Stück beim Start erzeugt):
public class Star implements Obj {
private int x = 0;
private int y = 0;
private int sz = 1;
private int vy = 0;
public Star(int x, int y, int r, int v) {
this.x = x;
this.y = y;
this.vy = v;
this.sz = r;
}
@Override
public void draw(Graphics2D g) {
if (sz > 1) {
g.setColor(Color.gray);
g.fillOval(x - sz, y - sz, sz * 2, sz * 2);
g.setColor(Color.WHITE);
g.fillOval(x - (sz / 2), y - (sz / 2), sz, sz);
} else {
g.setColor(Color.WHITE);
g.fillOval(x - sz, y - sz, 2 * sz, 2 * sz);
}
}
@Override
public boolean animate() {
y = y + vy;
if (y > 1090) {
x = (int) (1920 * Math.random());
y = 0;
}
return false;
}
@Override
public int getX() {
return x;
}
@Override
public int getY() {
return y;
}
}
Naja, und eigentlich war es das schon mit der gesamten Animation. dann noch einen KeyListener auf MainFrame angebunden, der die Aktuell sichtbaren Schiffe durchgeht und entsprechend "beschießt".
Das Spiel ist auf Github zu finden, da kann man auch aktuelle Binaries runterladen. Diese sollte man einfach mit java -jar TextAttack.jar starten können. Alledings ist eine aktuelle JDK-Version (>=15) nötig!
Das ganze Projekt hat mich ca 6 Stunden gekostet, von der Konzeption bis zur Fertigstellung. Also seit nachsichtig mit mir, wenn der Code evtl. buggy ist oder sonstwie sub-optimal... Danke!