Thema: Delphi Objekt Kommunikation

Einzelnen Beitrag anzeigen

Benutzerbild von Glühwürmchen
Glühwürmchen

Registriert seit: 31. Okt 2003
Ort: Pfinztal
156 Beiträge
 
Delphi 2010 Professional
 
#15

Re: Objekt Kommunikation

  Alt 19. Okt 2009, 12:03
Also gut, hier nocheinmal zusammenfassend, die Endlösung:

Das verwendete Event findet sich in einer eigenen Unit, die nur Events enthalten wird:
Delphi-Quellcode:
type
  TWaffeAbgefeuert_Event = procedure(Sender : TObject;
                                      koAktuelleKoordinaten: TKoordinaten;
                                      koZielKoordinaten: TKoordinaten;
                                      iSchussEnergie: Integer) of Object
  ;

Das SPIEL ist die Unit, in der die gesamte Spiel-Logik untergebracht sein wird. Das heißt, alles was sich bewegt oder mit anderen interagieren will, muss dies über das SPIEL tun:
Delphi-Quellcode:
unit uSpiel;

interface

uses
  mEvents, mSpieler, mWaffe, SysUtils;

type
  TSpiel = class
    private
      _Spieler : TSpieler;
      _pVirtuelleWaffe : TWaffe;

    public
      constructor Create;
      procedure OnWaffeAbfeuernEvent (Sender : TObject;
                                      koAktuelleKoordinaten: TKoordinaten;
                                      koZielKoordinaten: TKoordinaten;
                                      iSchussEnergie:Integer);
    end
;

implementation

uses
  Dialogs, Graphics;

constructor TSpiel.Create;
begin
  // Das virtuelle Abbild, aller im Spiel möglichen Waffen
  _pVirtuelleWaffe := TWaffe.Create('Test-Waffe');
  _pVirtuelleWaffe.OnWaffeAbfeuernEvent := OnWaffeAbfeuernEvent;

  // Einen Spieler anlegen.
  // Dort wird dann auch eine Einheit mit ihren Waffen erzeugt.
  _Spieler := TSpieler.Create;
end;

procedure TSpiel.OnWaffeAbfeuernEvent(Sender : TObject;
                                      koAktuelleKoordinaten: TKoordinaten;
                                      koZielKoordinaten: TKoordinaten;
                                      iSchussEnergie: Integer);
begin
  // Wird aufgerufen wenn in TWaffe "Feuern" durchlaufen wird.
  ShowMessage('Da schießt jemand!');
end;

end.
Die WAFFE ist Teil einer EINHEIT, die einem SPIELER gehört. Sie weiß nur dass sie eine Waffe ist und schießen kann. Das SPIEL muss selbst wissen, was es mit einem solchen Schuss tun muss.
Delphi-Quellcode:
unit uWaffe;

interface

uses
  Classes, mEvents;

type
  TWaffe = class
    private
      _sName : String;

      fWaffeAbfeuernEvent: TWaffeAbgefeuert_Event;

    public
      constructor Create(sNameDerWaffe: String);
      property OnWaffeAbfeuernEvent: TWaffeAbgefeuert_Event
                read fWaffeAbfeuernEvent write fWaffeAbfeuernEvent;
      procedure Feuern(koAktuelleKoordinaten, koZielKoordinaten: TKoordinaten;
                        iSchussEnergie: Integer); virtual;
    end
;

implementation

uses
  Dialogs;

constructor TWaffe.Create(sNameDerWaffe: String);
begin
  _sName := sNameDerWaffe;

  {*** TWaffe.Create ***}
end;

procedure TWaffe.Feuern(koAktuelleKoordinaten, koZielKoordinaten: TKoordinaten;
                        iSchussEnergie: Integer);
begin
  ShowMessage('Feuer frei!');
  if Assigned(fWaffeAbfeuernEvent) then begin
    fWaffeAbfeuernEvent(self,
                        koAktuelleKoordinaten, koZielKoordinaten,
                        iSchussEnergie);
  end;
  ShowMessage('Jetzt fängt meine Waffe an, in der Gegend herum zu ballern...!');
end;

end.
Testinstanz in diesem Falle ist die frmStartseite (mein einziges Formular zu diesem Zeitpunkt):
Delphi-Quellcode:
unit frmStartseite;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, mSpiel, mSpieler, uToolsFB, mWaffe, uGlobals, mEinheit;

type
  TfrmStartGBH = class(TForm)
    btnFeuern: TButton;
    procedure btnFeuernClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  end;

var
  frmStartGBH: TfrmStartGBH;

implementation
{$R *.dfm}

procedure TfrmStartGBH.btnFeuernClick(Sender: TObject);
var
  pSpiel : TSpiel;
  pSpieler : TSpieler;
  pAktiveEinheit : TEinheit;
  slWaffenListe : TStringList;
  pWaffe : TWaffe;
  koStart, koZiel : TKoordinaten;
  iAnzElem : Integer;

begin
  // Das Spiel anlegen
  pSpiel := TSpiel.Create;
  if not Assigned(pSpiel) then exit;

  // Eine Waffenliste erzeugen
  slWaffenListe := TStringList.Create;

  // Die aktive Einheit (z.B. ein Raumschiff) erfragen
  pSpiel.GibSpieler(pSpieler);
  pAktiveEinheit := pSpieler.GibAktiveEinheit;

  // Die Waffen dieser Einheit erfragen
  // Das Result von "GibWaffenListe" ist die Anzahl ihrer Elemente
  iAnzElem := pAktiveEinheit.GibWaffenListe(slWaffenListe);
  if (not Assigned(slWaffenListe)) or (iAnzElem = 0) then begin
    // slWaffenliste nicht angelegt oder leer --> Eine Waffe anlegen.
    pWaffe := TWaffe.Create('Test-Waffe', TRUE, 100, 99, 100);
    pWaffe.OnWaffeAbfeuernEvent := pSpiel.OnWaffeAbfeuernEvent;
  end else begin
    // slWaffenliste nicht leer --> Erste Waffe darin benutzen
    pWaffe := (slWaffenListe.Objects[0]) as TWaffe;
  end;

  // Die Koordinaten der schießenden Einheit festlegen
  koStart := TKoordinaten.Create(0, 0);
  // Die Koordinaten der Ziel-Einheit festlegen
  koZiel := TKoordinaten.Create(1, 1);
  // 500 Energiepunkte in den Schuss legen und FEUER FREI!!
  pWaffe.Feuern(koStart, koZiel, 500);

  {*** TfrmStartGBH.btnFeuernClick ***}
end;

end.
Gruß Glühwürmchen
<><
  Mit Zitat antworten Zitat