Text Attack From Outer Space

Info

Datum: 18. 03. 2021 um 22:34:48

Schlagworte: Java Games

Kategorie: Games

Ursprünglich veröffentlicht auf: caluga.de

erstellt von Stephan Bösebeck

logged in

ADMIN


Text Attack From Outer Space

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" emoji github:smirk

Dann sollte es noch sowas wie verschiedene Level geben, damit sich der Schwierigkeitsgrad anpasst.

Dann noch ein wenig Effekte, Sounds etc. und fertig emoji github:smirk 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:

public interface 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 emoji github:smirk 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!