Einzelnen Beitrag anzeigen

Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#12

AW: gegenseitiger Zugriff von zwei abgeleiteten Klassen

  Alt 15. Nov 2010, 16:48
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

Geändert von Memnarch (15. Nov 2010 um 16:57 Uhr)
  Mit Zitat antworten Zitat