Programmstruktur Problem!

stulleman

Bekanntes Mitglied
Hallo Leute,
ich stehe zur Zeit vor mehreren kleinen Problemen beim programmieren von einem TD-Spiel.
Wer es nicht kennt: Tower defense - Wikipedia, the free encyclopedia .

Ich habe eine TDFrame Klasse die JFrame extended, eine TDPanel Klasse die JPanel extended und Runnable implementiert und Aufgaben wie update und draw übernimmt.
Weiterhin habe ich eine Level Klasse, die mit einer Id erstellt wird und so das jeweilige Level läd.
Diese Level Klasse speichert die waypoints des Weges in einer ArrayList, die enemies wieder in einer ArrayList, und die towers wieder in einer ArrayList. Enemy und Tower sind wieder jeweils Klassen.

Um jetzt zu checken, ob ein Tower schießen muss (der einfachheit halber nur ein Laserstrahl) wollte ich die Distanz von Gegner und Tower berechnen und gucken ob beide Radien zusammen addiert kleiner oder größer als RadiusGegner + RadiusTower sind.

Mein Problem: Wo checke ich das ganze? In der Tower Klasse oder in der Enemy Klasse? Wenn ich es in der Tower Klasse mache (lasse mir also eine frische Version der enemie ArrayList übergeben) könnte ich zwar theortisch einen Laserstrahl zeichnen lassen, doch wie würde ich dem Enemy jetzt z.B. health abziehen?

Und nur nebenbei, mein Enemy ist eigentlich quadratisch, deswegen wird es durch den Radius etwas ungenau beim Collision detecting, gibt es eine andere Möglichkeit? Mit Rectangle und intersect würde es nicht klappen, da der Radius vom Tower aufjedefall rund sein muss!

Danke schonmal (;
 

Landei

Top Contributor
Na der Turm berechnet, ob und auf wen er schießen muss, schießt und teilt dann im Falle eines Treffers dem getroffenen Feind mit, dass selbiger gerade einen Laserstrahl der und der Art abbekommen hat. Der Feind ändert seine Einstellungen selbsttätig entsprechend seiner Panzerung u.s.w. (was den Turm ja nicht zu interessieren hat).

Beim Radius-Test kannst du ja berechnen, ob eine der vier Ecken des Feindrechtecks nahe genug dran ist, das wird schon genauer.
 

stulleman

Bekanntes Mitglied
Ja, aber eben das ist ja mein Problem. Wie teile ich dem Enemy denn mit das er getroffen ist? Ich habe ja nur eine Kopie der ArrayList mit den Feinden drinn. Irgendeinen Denkfehler muss ich doch haben!
 

stulleman

Bekanntes Mitglied
Achsoo? Ich mache eine Methode in der Enemy Klasse um mit einem Laserstrahl getroffen zu werden, veränder so dann die Kopie der ArrayList und mache eine neue Methode in die Level Klasse um eine neue Version der ArrayList zu übergeben, richtig?
 

Fu3L

Top Contributor
Wenn dein Programmaufbau nicht unwies komplex ist und mit vielen Threads arbeitet, würde ich empfehlen, keine Kopie der ArrayList zu erzeugen (ich habe sogar die Vermutung, dass du gar keine Kopie anlegst^^). So kannst du einfach die Referenz auf die ArrayList Enemies aus dem Hauptprogramm an den Turm weiterreichen und wenn der dann prüft, kann er auch gleich eine Methode des Enemies aufrufen:

Java:
for(Enemy e : enemies) {
 if(Collision) { //Implementierung wie oben von Landei beschrieben
    e.hitByLaser(laserStrength); //Vllt. gibts ja upgrades? Daher mit Parameter.
    break; //Nur einmal schießen
 }
}

Dafür muss der Aufruf in der Hauptlogik so aussehen:

Java:
for(Tower t : towers) {
  t.attackIfPossible(enemies); //Hier ohne .copy()!
}

So hat der Methodenaufruf in Tower Auswirkungen auch über Tower hinaus^^
 

Landei

Top Contributor
Du kannst "flache" und "tiefe" Kopien machen:
Java:
////////// Flache Kopie ///////////

List<Enemy> original = ...
List<Enemy> copy = new ArrayList<Enemy>(original);

//Struktur
original +-+-+-+-+
         | | | | | 
         v v v v v 
Enemies  E E E E E 
         ^ ^ ^ ^ ^ 
         | | | | | 
copy     +-+-+-+-+


////////// Tiefe Kopie /////////

List<Enemy> original = ...
List<Enemy> copy = new ArrayList<Enemy>();
for(Enemy e : original) {
   copy.add((Enemy)(e.clone())); //auch von den Feinden wird eine Kopie gemacht
}

//Struktur
original +-+-+-+-+
         | | | | | 
         v v v v v 
Enemies  E E E E E 

copy     +-+-+-+-+
         | | | | | 
         v v v v v 
Enemies  E E E E E  (Kopien der originalen Enemies)

Bei einer "flachen" Kopie hast du also eine neue Liste, aber mit den gleichen Referenzen wie in der Original-Liste. Du kannst die Struktur der Original-Liste nicht über die Kopie-Liste ändern (also z.B. ein neues Element anfügen), aber die gemeinsam referenzierten Elemente lassen sich sehr wohl ändern.
 

stulleman

Bekanntes Mitglied
Ich mache das so:

Frame -> Panel (ist der einzige Thread, der das Level Objekt updatet) -> Level -> Towers,Enemies,Waypoints usw...

Das Level hat ja eine ArrayList mit enemies und towers, also update ich das Level so :
Java:
public void update() {
		for(int i = 0; i < enemies.size(); i++) {
			enemies.get(i).update();
		}
		
		for(int i = 0; i < towers.size(); i++) {
			towers.get(i).update(enemies);
		}
	}
Da der Tower und die enemies wieder eigene update methoden haben übergebe ich ihnen eine Kopie der ArrayList
Java:
towers.get(i).update(enemies);

oder? Ist das keine Kopie und ich muss mir das zurückschreiben sparen?
Danke nochmal und sorry falls das einer schon meinte, aber das hatte ich dann nicht verstanden (;
 

Fu3L

Top Contributor
Wenn du nirgendwo bewusst .copy() oder .clone() aufrufst ist es keine Kopie, die du übergibst. Das ist einfach ein Verweis auf die Liste, die bei allen, denen du diesen Verweis übergibst die selbe ist.

Um das mal an einem Beispiel zu illustrieren (das Beispiel ist nicht für eine Liste mit Objekten geeignet, aber vllt kommt das Verständnis dadurch):
Du hast einen Fernseher, der jetzt dein Objekt darstellt (zB deine Liste mit den Werten drin). Du kannst den Fernseher nicht direkt bedienen, weil er weit weg steht (so wie das Objekt sich weit weg im Heap befindet). Aber du hast eine Fernbedienung, die für deine Referenzvariable (ArrayList<Enemy> enemies) steht. Wenn du jezz folgendes tust:

Java:
ArrayList<Enemy> enemies = new ArrayList<Enemy>();
ArrayList<Enemy> enemies2 = enemies;
//Oder
methodenAufruf(enemies);

Dann sind in der Methode, die aufgerufen wurde bzw. in enemies2 nur Kopien deiner Fernbedienung vorhanden, aber jeder schaut auf den gleichen Fernseher. Wird jetzt bei einer dieser Fernbedienungen der Sender gewechselt, ändert sich der Sender für alle, die zusehen, weil sie ja nur auf einen Fernseher gucken.

Erst wenn du eine Methode wie .copy() oder .clone() aufrufst, wird auch ein neuer, baugleicher Fernseher hingestellt.
Und dann gibt es noch den von Landei beschriebenen Fall bei Sammlungen von Objekten, dass man einmal eben nur die SAmmlung kopiert, aber die Werte in beiden Sammlungen sind die selben und einmal, dass man die Sammlungen inklusive ihrer Objekte kopiert, sodass jede Liste ihre eigenen Objekte hat und nicht das Umschaltproblem aus der obigen Metapher auftreten kann ;)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
A [HILFE] - Minecraft-Problem! Spiele- und Multimedia-Programmierung 1
C Plugin Problem Spiele- und Multimedia-Programmierung 2
J JLayer Problem Spiele- und Multimedia-Programmierung 1
Meeresgott LWJGL 3 Problem mit einer Texture Spiele- und Multimedia-Programmierung 4
G Low Poly 3D LWJGL Shader Problem Spiele- und Multimedia-Programmierung 4
O Problem beim Aufrufen des Spiels von einem Menü Spiele- und Multimedia-Programmierung 7
G LIBGDX Texturen Problem Spiele- und Multimedia-Programmierung 1
G LIBGDX Problem beim resizen des Frames Spiele- und Multimedia-Programmierung 3
C AutoClicker Problem Spiele- und Multimedia-Programmierung 2
S OOP Logik Problem Spiele- und Multimedia-Programmierung 5
G LIBGDX Viewport Problem Spiele- und Multimedia-Programmierung 3
J Problem mit Game Of Life Spiele- und Multimedia-Programmierung 3
N Problem mit 2D Spiel Spiele- und Multimedia-Programmierung 17
C Minecraft Minecraft Plugin Problem Spiele- und Multimedia-Programmierung 17
R Pong Spiel Problem Spiele- und Multimedia-Programmierung 1
V Problem mit BufferStrategy Spiele- und Multimedia-Programmierung 2
Streeber Problem mit Transparenz/TextDrawing in LWJGL/Slick2d (OpenGL) Spiele- und Multimedia-Programmierung 1
E A-Stern Algorithmus Problem und Implementierung einer Map Spiele- und Multimedia-Programmierung 6
T LWJGL 2.9.2: Seltsamer Effekt beim Rendern (VertexShader Problem?) Spiele- und Multimedia-Programmierung 3
W Generelles Problem: Entscheidungsfindung Spiele- und Multimedia-Programmierung 4
T Problem bei Kollisionsabfrage Spiele- und Multimedia-Programmierung 4
C Vier Gewinnt Problem mit Ordnerstruktur Spiele- und Multimedia-Programmierung 2
T Problem mit Eclipse (java)-(minecraft) Spiele- und Multimedia-Programmierung 3
I Textbasiertes Spiel - Umsetzungsfrage & Schleifen Problem Spiele- und Multimedia-Programmierung 26
M Sound Problem Spiele- und Multimedia-Programmierung 3
T Problem beim Aufbau des Spielfelds Spiele- und Multimedia-Programmierung 18
M Sound Engin Problem 2 Spiele- und Multimedia-Programmierung 2
J Problem bei der GUI - Zu viele Spielbretter Spiele- und Multimedia-Programmierung 2
D LWJGL gluLookAt "Umschauen" Problem Spiele- und Multimedia-Programmierung 0
D Problem mit Würfelanimierung in LWJGL Spiele- und Multimedia-Programmierung 7
C Zeldaklon Problem mit Wand-Kollision Spiele- und Multimedia-Programmierung 8
0 Boxen übereinander stapelt Problem Spiele- und Multimedia-Programmierung 5
D Textfield im Game ,Problem: while-Schleife Spiele- und Multimedia-Programmierung 3
R 2D platformer - enemy damage -> TIMER PROBLEM Spiele- und Multimedia-Programmierung 3
S LWJGL Kamera Problem - Alles verzerrt Spiele- und Multimedia-Programmierung 4
B LWJGL StackOverFlow Problem nach 30sekunden. (Pong) Spiele- und Multimedia-Programmierung 2
Seikuassi LWJGL-Problem Spiele- und Multimedia-Programmierung 2
L Minecraft Minecraft Plugin programmieren (Craftbukkit 1.7.2) Problem Spiele- und Multimedia-Programmierung 4
B Minecraft mehr Ram zuweißen Problem Spiele- und Multimedia-Programmierung 0
K Bukkit Plugin Problem Spiele- und Multimedia-Programmierung 3
Y Problem mit repaint() in run() Spiele- und Multimedia-Programmierung 2
X Kleines Problem mit Java Reflections und einem eigenen Eventhandler Spiele- und Multimedia-Programmierung 1
T Problem mit Kollisionsabfrage der NPC Spiele- und Multimedia-Programmierung 1
J Minecraft Problem mit dem JRE - Minecraft Spiele- und Multimedia-Programmierung 3
TheSorm Problem mit 2 classen NullPointerException Spiele- und Multimedia-Programmierung 1
S Problem mit 4 gewinnt(MinMax Algorithmus) Spiele- und Multimedia-Programmierung 2
N Problem in der Main.class Spiele- und Multimedia-Programmierung 1
J Blöcke, Hitboxen, Koolisionsabfrage - Problem Spiele- und Multimedia-Programmierung 8
S Problem mit 3d-Polygon Spiele- und Multimedia-Programmierung 2
A Problem mit Sound Spiele- und Multimedia-Programmierung 5
C Nxt Duell Problem Spiele- und Multimedia-Programmierung 4
F LWJGL Problem mit Erstellen eines Objekts und der Kamera Spiele- und Multimedia-Programmierung 5
ruerob Problem bei Fade-Out von Sounds Spiele- und Multimedia-Programmierung 3
L [Slick2D] Problem bei Speicherfreigabe Spiele- und Multimedia-Programmierung 2
M Bukkit Plugin Problem Spiele- und Multimedia-Programmierung 22
T Java3D Rendering Problem Spiele- und Multimedia-Programmierung 7
J Problem bei pixelgenauer Kollisionsabfrage Spiele- und Multimedia-Programmierung 10
F Problem mit dem Abspielen von byte[] (Audioprogrammierung) Spiele- und Multimedia-Programmierung 2
C Problem mit Abspielen von Audio-Dateien Spiele- und Multimedia-Programmierung 3
R Problem bei Farbe ändern/4Gewinnt Spiele- und Multimedia-Programmierung 5
R StringIndexOutOfBoundsException - Problem Spiele- und Multimedia-Programmierung 2
S Problem mit Sichtfeld/Licht in einem Raster Spiele- und Multimedia-Programmierung 5
G Acht-Damen-Problem HILFE! Spiele- und Multimedia-Programmierung 11
A TileMap KeyListener - Problem Spiele- und Multimedia-Programmierung 2
J Problem mit Threads Spiele- und Multimedia-Programmierung 8
N Problem mit Kollisionsabfrage beim Fallen Jump & Run Spiele- und Multimedia-Programmierung 5
S Problem mit Zeitsteuerung der Game Loop Spiele- und Multimedia-Programmierung 4
Fu3L Problem mit 3D Noise Spiele- und Multimedia-Programmierung 4
L Problem beim Rätsellöser Spiele- und Multimedia-Programmierung 3
D Problem beim bewegen einer Figur Spiele- und Multimedia-Programmierung 2
T Problem bei LinkedList / JPanel Spiele- und Multimedia-Programmierung 4
T Problem mit ClassLoader und LWJGL Spiele- und Multimedia-Programmierung 5
M Scrolling Repaint Problem Spiele- und Multimedia-Programmierung 2
Samake03 [Problem] layeredPane bzw. Viewport Spiele- und Multimedia-Programmierung 3
Helgon glTexParameter / glTexImage2D Problem Spiele- und Multimedia-Programmierung 11
T Jmonkey opengl problem Spiele- und Multimedia-Programmierung 13
M Problem mit Kamera (glMultMatrix (OpenGL/ LWJGL)/ Quaternionen) Spiele- und Multimedia-Programmierung 5
M Problem mit Gameserver / Datensynchronisation Spiele- und Multimedia-Programmierung 10
G Mein erstes minigame -> problem mit Methode Spiele- und Multimedia-Programmierung 3
X Geometry Wars Clone Problem Spiele- und Multimedia-Programmierung 4
H Problem mit JMonkeyEngine3 und OgreXML Spiele- und Multimedia-Programmierung 3
D [JOGL 2.0] Kleines Problem mit freier Flugsteuerung Spiele- und Multimedia-Programmierung 3
A JAVA3D TransformGroup <--> Group Problem Spiele- und Multimedia-Programmierung 3
U [JOGL 1.1.1a]Kleines Problem mit Text Overlays: Spiele- und Multimedia-Programmierung 19
T Problem mit JnR-Steuerung / KeyListener Spiele- und Multimedia-Programmierung 6
D Problem Mit Miensweeper Clone & rekursive Methode Spiele- und Multimedia-Programmierung 4
M Performance Problem bei BufferedImage Spiele- und Multimedia-Programmierung 7
T Problem mit Speicherverbrauch Spiele- und Multimedia-Programmierung 5
BattleMaster246 Problem mit Jogl Spiele- und Multimedia-Programmierung 14
C MP3 Handler-Problem Spiele- und Multimedia-Programmierung 13
C [gelöst] MP3-Codec-Problem Spiele- und Multimedia-Programmierung 2
K Schiebepuzzle Array Zufallszahlen Problem Spiele- und Multimedia-Programmierung 8
J Java 3D Problem Spiele- und Multimedia-Programmierung 2
G Eclipse Problem mit Java3d Spiele- und Multimedia-Programmierung 3
H Repaint-Problem mit Quaxlis Tutorial Spiele- und Multimedia-Programmierung 2
C Java Sound API Clip.Close() Problem Spiele- und Multimedia-Programmierung 1
K Problem beim Anzeigen von Bildern Spiele- und Multimedia-Programmierung 5
D Problem mit Überprüfung beim Lottospiel Spiele- und Multimedia-Programmierung 6
D Problem beim Öffnen einer PHP für eine Highscore Spiele- und Multimedia-Programmierung 5
A KeyListener - Thread Problem Spiele- und Multimedia-Programmierung 2

Ähnliche Java Themen

Neue Themen


Oben