![]() |
Re: Objekt Kommunikation
Delphi-Quellcode:
if (not Assigned(slWaffenListe)) or (slWaffenListe.Count = 0) then begin
lLogger.LogFmt('TfrmStartGBH.Button1Click: slWaffenliste nicht angelegt oder leer.', [], llError); lLogger.LogFmt('TfrmStartGBH.Button1Click: Lege eine Test-Waffe an.', [], llWarning); pWaffe := TWaffe.Create('Test-Waffe', TRUE, 100, 99, 100); // ==> pWaffe.OnWaffeAbfeuernEvent := OnWaffeAbfeuernEvent; // <== end else begin pWaffe := (slWaffenListe.Objects[0]) as TWaffe; end; |
Re: Objekt Kommunikation
So geht es leider nicht:
Im Strukturfenster schreibt Delphi: Zitat:
Zitat:
|
Re: Objekt Kommunikation
Sorry, es muss wohl heißen:
Delphi-Quellcode:
Dazu musst du allerdings die Prozedur TSpiel.OnWaffeAbfeuernEvent public machen.
pWaffe.OnWaffeAbfeuernEvent := pSpiel.OnWaffeAbfeuernEvent;
|
Re: Objekt Kommunikation
Aaaahhh, vielen Dank!
Meine Waffe ballert offenbar mit Über-Lichtgeschwindigkeit. Da mein Spiel die Meldung, dass die Waffe schiesst schon bringt BEVOR die Waffe ihre Meldung bringen kann.... _*grins*_. Super. Ich hoffe, mit dieser Vorlage nun alle Events im Spiel hinzubekommen. Nochmals vieles Dankeschön ! |
Re: Objekt Kommunikation
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:
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.
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.
Delphi-Quellcode:
Testinstanz in diesem Falle ist die frmStartseite (mein einziges Formular zu diesem Zeitpunkt):
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.
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. |
Re: Objekt Kommunikation
Noch eine Anmerkung am Schluss:
In dieser Zeile des Feuer-Buttons vom Formular
Delphi-Quellcode:
wird es je nach Einstellung in den Projektoptionen evtl. zur Exception kommen:
iAnzElem := pAktiveEinheit.GibWaffenListe(slWaffenListe);
if (not Assigned(slWaffenListe)) or (slWaffenListe.count = 0) then begin Wenn slWaffenListe nicht "assigned" ist, dann kann ich auch nicht mit ".count" darauf zugreifen! Da ich aber in den Projektoptionen unter Compiler die "Vollst. Boolesche Auswertung" deaktiviert habe, wird bei mir die Prüfung einer if-Abfrage beendet, sobald das Gesamt-Ergebnis der Abfrage feststeht! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:17 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz