Square Tower Defense

Beschreibung

Square Tower Defense ist ein klassisches Tower Defense Spiel, bei dem eine Verteidigung aufgebaut werden muss, die den gegnerischen Angriffswellen standhält.
Hierbei stehen sechs verschiedene Türme zur Auswahl mit jeweils fünf Leveln. Ein Turm auf Level eins ist am schwächsten, während Level fünf das Beste ist.
Die Quadrate, die sich auf der markierten Strecke bewegen, stellen die Gegner dar. Sobald sie das Ende erreichen, ist das Spiel verloren.

Wie wird gespielt?

Zuallererst muss die Welt ausgewählt werden, auf der gespielt werden soll. Hierbei stehen einfache bis extrem schwere Welten zur Verfügung.
Das Spiel ist nicht responsive, da alles auf Pixelwerten basiert. Deswegen verfügt jedes Spielfeld über eine Grössenangabe in Pixel, welche nicht verändert werden kann.
Square Tower Defense ist auf 1920x1080 mit 60Hz optimiert. Es existiert keine Touch-Steuerung.

Nachdem eine Welt ausgewählt wurde, startet das Spiel sofort.
Oben rechts wird das verfügbare Guthaben dargestellt und gleich darunter liegt die Auswahl der Türme.
Mit einem Linksklick auf das Spielfeld (nicht auf einen Turm oder die hellbraune Strecke) wird ein Turm gekauft und an der Position der Maus platziert, falls genug Geld vorhanden ist. Alle Türme schiessen vollautomatisch auf den vordersten Gegner. Es liegt in der Verantwortung des Spielers, die Türme auf eine Weise zu platzieren, sodass sie möglichst viele der quadratischen Gegner erwischen.
Das Zerstören von Gegnern erhöht das Guthaben, womit Upgrades und neue Türme erstanden werden können.
Mit Rechtsklick auf einen Turm lässt sich ein Menü öffnen, in welchem der Turm kostenpflichtig verbessert oder verkauft (entfernt) werden kann. Das Verkaufen dient lediglich zur Platzbeschaffung. Man erhält dadurch kein Geld zurück.

Mit der Escape-Taste lässt sich das Spiel pausieren oder ein öffenes Menü schliessen, ohne eine Aktion zu tätigen.
Falls ein Gegner das Ende der Strecke erreicht, ist das Spiel verloren. Mit F5 oder Ctrl+R lässt sich das Spiel neu starten.

Jetzt spielen

Entwicklung

Die Entwicklung dieses Spiels kostete mich lediglich drei volle Tage, obwohl ich erst im zweiten Lehrjahr war, als ich es entwickelte. Damals war mir nicht bewusst, wie ein Spiel in einem Canvas responsive gestaltet werden kann und wie unterschiedliche Bildwiederholraten unterstützt werden können, ohne die Geschwindigkeit der Gegner und Projektile ungewollt zu erhöhen oder zu verringern. Deswegen funktioniert das Spiel ausschliesslich in 1080p mit 60Hz einwandfrei.

Zuerst erstellte ich das Canvas, um hellbraune Rechtecke darauf zu zeichnen, welche später die erste Welt darstellten. Schnell wurde mir die Notwendigkeit der Klasse "Map" bewusst, denn ohne sie würde ich denselben Code mehrfach kopieren müssen, um das Spiel mit neuen Welten zu ergänzen.

In der Klasse "Map" erstellte ich "MapPart", die einen einzelnen Abschnitt der Welt darstellte.
"MapPart" speichert lediglich die Position und die Ausrichtung eines Abschnittes. Mit "MapPart.draw()" lässt sich der Streckenabschnitt auf das Canvas zeichnen. Gleichermassen ergänzte ich "Map" um die Funktion "draw()", die wiederum alle Teile der jeweiligen Welt zeichnet.

Danach erstellte ich die Klassen "Level" und "Enemy", wobei "Level" alle Gegner verwaltet. Mit der Funktion "Level.start()" lässt sich das nächste Level starten.
"Level" ist ebenfalls dafür zuständig, sämtliche Gegner zu bewegen und automatisch ein neues Level zu starten, falls die Gegner besiegt wurden.
"Enemy" hingegen speichert alle Daten eines Gegners, wie zum Beispiel die Geschwindigkeit, die Anzahl der Leben und das Aussehen. Damit die Gegner "wissen", wo sich die Strecke befindet, wird der Streckenabschnitt und die genaue Position ebenfalls in "Enemy" gespeichert. Falls ein Gegner ans Ende eines Abschnitts gelangt, wird er zum Anfang des nächsten gesetzt.

Als die Gegner und Level funktionstüchtig waren, implementierte ich die Türme. Hierfür erstellte ich die Klasse "Tower".
Bei einem Linksklick wurde anhand des Namens des ausgewählten Turms, des verfügbaren Guthabens und der momentanen Position der Maus bestimmt, was für ein Turm an welcher Stelle platziert werden soll und ob diese Aktion überhaupt durchgeführt werden darf. Jeder Turm verfügt über eigene Werte wie die Reichweite, das Projektil und die Nachladegeschwindigkeit.

Da für "Tower" ein Projektil benötigt wird, erstellte ich die Klasse "Projectile". Sobald der Ladevorgang eines Turms abgeschlossen ist, wird nach dem nächsten Gegner gesucht. Falls dieser Gegner in Reichweite ist, wird das Projektil in seine Richtung verschossen.
Jedes Projektil hat eine eigene Geschwindigkeit, Lebensdauer, Schaden und ein Schadensintervall. Dieses Intervall wird benötigt, damit ein Projektil einen Gegner nicht in jedem Einzelbild treffen kann, sondern nur alle paar Bilder.

Die grösste Arbeit stand zu diesem Zeitpunkt noch vor mir: Das Balancing. Ich musste sicherstellen, dass kein Gegner zu stark oder zu schwach war und dass jeder Turm in einzigartigen Situationen eingesetzt werden kann und jedes höhere Level einen grösseren Nutzen erbringt als das vorherige.

Da dieses Projekt bereits ziemlich alt ist und seit dem Frühling 2020 kein Update mehr erhielt, werde ich wahrscheinlich irgendwann eine von Grund auf überarbeitete Version entwickeln mit neuen Türmen, Upgrade-Möglichkeiten, einzigartigen Fähigkeiten, Texturen, Sounds und vor allem ein für jeden Gerätetyp optimiertes Design.