Autor Beitrag
knittel
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 71
Erhaltene Danke: 2

Win XP, Win7, openSUSE
Delphi 7
BeitragVerfasst: Do 02.12.10 19:02 
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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
type TMilitaryUnitMultiWeapon = class (TMilitaryUnit)
  protected
    FWeapons: TList;
  public
    procedure CheckForToATK (); override// Checks if an Enemy is in Range
    procedure Shoot (Weapon, ToX, ToY, OnUnit: integer); override;// Shoots ToX/ToY
    procedure Reload (); override;// Let the Unit Reload
  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
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
type TMilitaryUnitMultiWeapon = class (TMilitaryUnit)
  protected
    FWeapons: array of TWeaponInformation;
  public
    procedure CheckForToATK (); override// Checks if an Enemy is in Range
    procedure Shoot (Weapon, ToX, ToY, OnUnit: integer); override;// Shoots ToX/ToY
    procedure Reload (); override;// Let the Unit Reload
  end;

Hier ist logischerweise die Frage ob ich dann in den einzelnen Klassen sagen müsste:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
type TCollosusUnit = class (TMilitaryUnit)
  protected
    FWeapons: array[0..5of TWeaponInformation;
  end;

// oder in der OnCreate:
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.

_________________
"Wir können nicht fliehen!" "Wieso nicht?" "Sie haben mir die Schnürsenkel zusammengebunden!" "Die Schweine."
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: 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.
ausblenden 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.

_________________
Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS

Für diesen Beitrag haben gedankt: knittel
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 71
Erhaltene Danke: 2

Win XP, Win7, openSUSE
Delphi 7
BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
TWeaponInformation(FWeapons.Items[Weapon]).CurrentReload					

Erhalte ich folgende Fehlermeldung: Invalid Typecast

_________________
"Wir können nicht fliehen!" "Wieso nicht?" "Sie haben mir die Schnürsenkel zusammengebunden!" "Die Schweine."


Zuletzt bearbeitet von knittel am Do 02.12.10 21:14, insgesamt 1-mal bearbeitet
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 71
Erhaltene Danke: 2

Win XP, Win7, openSUSE
Delphi 7
BeitragVerfasst: Do 02.12.10 21:15 
Wie sollte ich es mir denn einfach machen?

_________________
"Wir können nicht fliehen!" "Wieso nicht?" "Sie haben mir die Schnürsenkel zusammengebunden!" "Die Schweine."
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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.