Alexey Schröder

immer bereit!

Tower Defence

Das Projekt wurde in Rahmen der Veranstaltung "Java 3D"entwickelt, Projektleiter: Prof. Dr.-Ing. Volker Luckas. Das Ziel des Projekts ist es, eine Variante des bekannten Spiels "Tower Defence" in der Programmiersprache Java zu implementieren. Dafür wird die Bibliothek Java3D herangezogen.


Screenshots:

scr1 scr2 src3 src4 src5 src6


 

Spielregeln:

  • Die Angreifer folgen einem vordefinierten Weg
  • Die Tower (Abwehrtürme) stehen, jedoch nicht auf dem zuvor definierten Weg der Angreifer
  • Beide können einen Schuß mit Ihrer Waffe abgeben
  • Die Tower (Abwehrtürme) müssen alle Angreifer vernichten
  • Die Angreifer müssen das Ende des Wegs erreichen

 

 

 

Es wurden Kategorien von Angreifern und Verteidigern implementiert.

Kategorien von Verteidigern:

LaserTower

 

Sehebereich von LazserTower
Abbildung 1

Der LaserTower verfügt über eine LaserKanone. Die Kanone schießt mit einem Laserstrahl, der den Angreifern ein bestimmten Schaden zufügt. Der Schaden wird in Schadenseinheiten bemessen. Die LaserKanone erreicht bei einem Treffer, ein Schaden von einer Schadenseinheit. Für die Positionierung der Kanonen werden zwei Behaviors genutzt. Ein Behavoir dreht die Kanone in vertikaler Ebene und das andere in horizontaler. Die Kanone "spürt" ihre Feinde in einem bestimmten Bereich (Umfeld) auf. Der Erkennungssensor funktioniert ähnlich wie ein Radarsystem. Befindet sich ein Gegener im Umkreis von neun Metern (blauer Ring), ist der Gegener im Radarbereich und wird angegriffen. Befindet sich der Gegner im Umkreis von drei Metern so befindet sich der Gegener außerhalb des Radar-Kreises (grüner Ring) "ausRad ". Abbildung 1 zeigt, die unterschiedlichen Segmentabschnitte, der grüne Ring symbolisiert einen Radius von 3 und der blau Ring einen Radius von 9. Selbstverständlich kann man die Radien ändern, dafür passt man in der Klasse "LasertTower.java" die Werte von "inRad" und " ausRad" an. Die LaserTower haben eine Widerstandskraft, die in 300 Lebenseinheiten festgelegt ist. D.h. die Tower können z.B. 300 Laser-Treffer überleben.

 

RaketenTower

 

Sehebereich von LazserTower
Abbildung 2

RaketenTower verfügen über zwei Raketen. Jeder Raketen-Treffer verursacht ein Schaden von insgesamt fünfzig Schadenseinheiten. Für die Positionierung der Kanone wird ein Behavior genutzt, das die Kanone in horizontaler Ebene dreht. Die Tower "spüren" ihre Feinde im Bereich, des Radars (siehe Abbildung 2) auf. Im Bereich von neun Metern wird der Gegener erfasst. Ist der Gegener im Umkreis von sechs Metern, befindet er sich außerhalb des Radarangriff-Systems "ausRad". Abbildung 2 zeigt: befindet sich der Gegner im äußeren Bereich (blauer Ring), wird der Gegner angegriffen. Selbstverständlich kann man die Radien manipulieren, dafür ändert man in der Klasse "RaketeTower.java" die Werte von "inRad" und "ausRad". Eine Rakete verursacht ein Schaden von 50 Schadenseinheiten in Abhängigkeit vom Quadrat des Abstandes zwischen Objekt und der Einschlagsposition der Rakete. Wenn die Rakete z.B. das Objekt direkt trifft, verursacht der Treffer beim Objekt den maximalen Schaden von genau 50 Schadenseinheiten, da der Abstand null ist.

 

 

Positionierung der Verteidiger:

Zu Beginn des Spiel gibt es die Möglichkeit die Positionierung der Tower zu bestimmen. Hierfür wird die Datei "Verteidigender.txt" angebunden. Die Datei enthält eine Matrix, bei der durch "1" ein LaserTower und durch "2" ein RaketenTower erzeugt wird.

 

 

Angreifer: LaserPanzer

Der Panzer verfügt über eine LaserKanone. Die LaserKanone funktioniert auf die gleiche Weise, wie der LaserTower. Der LaserPanzer folgt einem vordefinierten Weg, der durch die Klasse "Weg.java" bestimmt wird. Der Panzer hat die Fähigkeit, dem Terrain zu folgen. D.h. er ändert seine Position und Neigung zum Horizont in Abhängigkeit von der Höhe des Terrains im aktuellen Punkt. Der Panzer verfügt über 500 Lebenseinheiten.

 

 

Terrain:

Das Terrain hat eine bestimmte Länge und Breite, die in der Maßeinheit Meter festgelegt ist. Die Werte können in der Klasse "Terrain.java" geändert werden. Das Relief des Terrains wird durch die Matrix, die in der Datei "Terrain.txt" abgelegt ist, bestimmt. Jede Zahl der Matrix gibt die Höhe des Terrains in Metern im Punkt an. Die Koordinaten des Punktes werden abhängig von Breite und Länge des Terrains interpoliert. Das Terrain besteht aus 180.000 Dreiecken, die in ein einziges Shape3D verschmolzen werden. Die Anzahl der Dreiecken wird durch den Parameter "Auflösung" im Konstruktor bestimmt. Der Parameter gibt an, wie groß der Abstand zwischen zwei Nachbarpunkten im "Dreiecksnetz" ist. Das Terrain benutzt keine Texturen.

 

 

Die wichtigste Klasse des Spiels: Radar.java

Die Klasse Radar wird von allen Spielobjekten genutzt. Mit Hilfe dieser Klasse wird der "Sichtbereich" des "Wirtes" nach einem Feind untersucht. Falls ein Feind gefunden wird, übergibt das Radar den Link des Feindobjekts an die Interpolatoren. Die Interpolatoren drehen die Kanonen in Richtung des Ziels. Das Radar nimmt dadurch die wichtigste Rolle ein, denn alle Aktivitäten der Spieler werden durch das Radar ausgelöst. Alle Spieler nutzen die selbe Klasse (NICHT die selbe Instanz der Klasse!). Die Klasse "Radar.java" hat einen Parameter im Konstruktor: die FeindListe. Die FeindListe ist eine Instanz von LinkedList, welche die Links auf alle Gegner des Spiels enthält. Das Radar "läuft" durch die Liste und "fragt" nach Koordinaten. Wenn der Gegner in Reichweite des Spielers ist, ist er ein Kandidat zum Vernichten. Aus allen Kandidaten wird einer gewählt, der weiter als das Ziel des Spielers ist.

 

 

Verwaltung:

Das Spiel enthält die Klasse "AngreiferManager.java". Die Klasse "produziert" Angreiferscharen. Das passiert nicht kontinuerlich, sondern "in Wellen". Zuerst werden fünf Panzer mit einer Verzögerungszeit von drei Sekunden erzeugt. Anschließend wartet der Verwalter zehn Sekunden und prüft ob noch Tower existieren. Falls Tower noch existieren sollten werden weitere zehn Panzer geschickt usw. Jede Welle besteht aus fünf Panzern mehr als die vorhergegangene Welle. Der Zeitabstand zwischen den zu erzeugenden Wellen beträgt zehn Sekunden. Selbstverständlich können alle Verzögerungswerte manipuliert werden.

Der Quelltext des Spiels ist hier zu finden.