Ich denke man kann hier folgendermaßen vorgehen(so mach ich das normalerweise)
Wir definieren eine Klasse TEntity.
TEntity hat verschiedene Parameter die genutzt werden können(leben, waffen und vielleicht nochn paar neutrale skills bei bedarf).
TEntity besitzt ein Event EntityAction.
Ich entferne mich an dieser stelle davon für jeden Typus eines Gegners eigene Klassen abzulaieten, und benutze eine einzige. Der clou an der sache ist, dass das was das Object machen soll an dass EntityAction event Attached wird.
Erstellen wir eine TEntity dass als Gegner fungieren soll kann so zb die selbstgeschriebene Methode Gegner genutzt werden, ODER wir schreiben eine Methode die den Playercode enthält.
Beispiel(aus meiner kleinen mini 2dengine)
Code:
TEntity = class(TComponent)
public
Mesh: TMesh;
Skill1: Single;
Skill2: Single;
Skill3: Single;
Skill4: Single;
Skill5: Single;
Skill6: Single;
Skill7: Single;
Skill8: Single;
Skill9: Single;
Skill10: Single;
EntityAction: procedure(My: TEntity);
constructor Create(AOwner: TComponent); override;
end;
Ein einfaches beispiel für eine Entity Klasse
Eine Aktion für das Object kann dann so geschrieben werden:
Code:
procedure MeineAktion(My: TEntity)
begin
My.Skill1 := My.Skill1+2;
end;
Zugewiesen kann es dann so werden:
Code:
MeineEntity.EntityAction := MeineAktion;
Dann brauchst du noch eine schleife, die alle aktionen der in einer liste gespeicherten Objekte ausführt:
Code:
procedure TEngine.DoEntityActions;
var i: Integer;
begin
for i := 0 to FEntityCount - 1 do
begin
if Assigned(FEntityLIst[i].EntityAction) then
begin
FEntityLIst[i].EntityAction(FEntityLIst[i]);
end;
end;
end;
FEntityList ist ein Array indem alle erstellten Entyties hinterlegt sind.
Deren EntityAction wird(falls verfügbar) aufgerufen und der Action die Entity instanz übergeben.
Dass mal als anregungen
Wenn was unverständlich ist, einfach nachfragen^^. Bin schlecht im erklären
EDIT: die erstellung meines Spielers sieht bei mir dann z.B. so aus(ginge noch schöner, aber war maln "Iam Boored" projekt^^:
Code:
Player := GameEngine.AddEmptyEntity(Point(0,0),Self);
Player.Mesh.LoadFromMesh(CarMesh);
Player.Mesh.Pos_X := -25;
Player.Mesh.Pos_Y := 650;
Player.Mesh.RefreshBBox();
Player.EntityAction := PlayerAction;
EDIT2: Und Außerdem gehören Pos_X/Y eigentlich nicht in die Meshklasse*hust*
Kommt zur Entity, da das Mesh per Entity Position für die WeltPosition versetzt wird.
MFG
Memnarch