Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Tlist / array
knittel - Do 02.12.10 19:02
Titel: Tlist / array
Hallo allerseits,
Ich entwickle ein Strategiespiel. Darin soll es Einheiten mit mehreren Waffen geben: z.B.
TCollosusUnit: 6 Waffen
TCrusaderUnit: 3 Waffen
Ich habe als Überklasse gemacht:
TMultiWeaponMilitaryUnit
Dadurch kann ich in CheckForATK() (welche prüft ob gegnerische Einheiten in der Reichweite sind) einfach sagen for i:= 0 to CountOfWeapons do ...
Jetzt ist meine Frage, wie ich es am besten löse, dass die Einheiten unterschiedlich viele Waffen haben.
Erster Lösungsansatz:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| type TMilitaryUnitMultiWeapon = class (TMilitaryUnit) protected FWeapons: TList; public procedure CheckForToATK (); override; procedure Shoot (Weapon, ToX, ToY, OnUnit: integer); override; procedure Reload (); override; end; |
In die Liste füge ich dann den Record TWeaponInformation hinzu (je nach Waffenanzahl unterschiedlich viele). Allerdings komm ich mit TList nicht gut zurecht, weil ich nicht weiß ob man da jetzt irgendwie speicher reservieren muss oder net.
Zweiter Lösungsansatz
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| type TMilitaryUnitMultiWeapon = class (TMilitaryUnit) protected FWeapons: array of TWeaponInformation; public procedure CheckForToATK (); override; procedure Shoot (Weapon, ToX, ToY, OnUnit: integer); override; procedure Reload (); override; end; |
Hier ist logischerweise die Frage ob ich dann in den einzelnen Klassen sagen müsste:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| type TCollosusUnit = class (TMilitaryUnit) protected FWeapons: array[0..5] of TWeaponInformation; end;
constructor TCollosusUnit.Create (Team, AtX, AtY: cardinal); begin SetLength(FWeapons, 5); end; |
Allerdings dauert der SetLength Befehl ja ziemlich lange, was mich eher nicht zu einem Freund dieses Lösungswegs macht.
Also, falls die Frage etwas unklar ist:
Ist TList für diesen Fall besser, obwohl die Zahl der Waffen pro Einheit eigentlich immer gleich bleibt oder ist ein array besser? Und wenn TList besser ist: Muss ich dafür Speicher reservieren oder so?
Danke im voraus.
bummi - Do 02.12.10 20:02
Wieso meinst Du Setlength würde lange dauern?
Wenn Du mit Listen arbeitest hängst Du ja in die Liste einen Zeiger, dieser zeigt sinnvollerweise auf eine Klasse
also z.B.
Delphi-Quelltext
1: 2:
| For i := 1 to FWeaponcount do FList.Add(TWeaponInformationClass.Create); |
Bei TList musst Du die Objekte auch wieder freigeben
alternativ könntest Du TObjectList verwenden hier kannst Du die Freigabe der Liste überlassen.
jaenicke - Do 02.12.10 20:09
Und wenn du wirklich Objekte als Objekte benutzen willst, kannst du einfach TObjectList benutzen. Wenn du im Konstruktor True übergibst, kümmert sich die Liste auch um die Freigabe, wenn du den Eintrag löschst oder die Liste freigibst.
// EDIT:
Ok, das Edit hab ich zu spät gesehen^^
knittel - Do 02.12.10 20:51
Danke schonmal.
Ich wusste nicht das man in eine TObjectList auch records tuen kann. Ich dachte die TObjectList wäre nur für Klassen. Ich probiers gleich aus.
Danke nochmal! :)
EDIT: Gab irgendwie ein Problem:
Wenn ich auf die Waffeninformationen zugreifen will:
Delphi-Quelltext
1:
| TWeaponInformation(FWeapons.Items[Weapon]).CurrentReload |
Erhalte ich folgende Fehlermeldung: Invalid Typecast
jaenicke - Do 02.12.10 20:53
Ach so, das sind Records? Warum machst du es dir denn so schwer? :gruebel:
Die gehen nicht in die ObjectList, nein.
knittel - Do 02.12.10 21:15
Wie sollte ich es mir denn einfach machen?
jaenicke - Do 02.12.10 21:31
Na, eine Klasse TWeapon, zum Laden und Speichern z.B. gleich mit LoadFromStream und SaveToStream, davon abgeleitet die speziellen Waffen ggf., dann passt das auch in eine TObjectList. Außerdem musst du dich nicht um das Reservieren vom Speicher kümmern.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!