Hallo Leute,
in diesem Threat wird gefragt und beantwortet, womit ich mich gerade herumschlage. Aber leider will es mir nicht gelingen, das Projekt ans Laufen zu kriegen.
Folgende Aufgabenstellung:
Ich entwickle ein Spiel, in dem man (sehr vereinfacht ausgedrückt) mit Raumschiffen rumfliegen und auf andere Schiffe ballern können soll.
Da ich das Spiel vollständig objektorientiert programmieren will, muss ich mich mit der Frage beschäftigen, was genau passiert, wenn eine Einheit_1 auf eine Einheit_2 schießt.
Ich habe - hierfür relevant - folgende Klassenstruktur:
TSpiel - TSpieler - TEinheit - TWaffe
Die Waffe soll nichts von den Einheiten wissen. Sie weiß nur, dass sie eine Waffe ist und was sie braucht um loszuballern.
Die schießende Einheit soll nichts von der anvisierten Einheit wissen. Sie weiß nur das sie eine Einheit (ein Schiff) ist, eine Waffe hat und diese in irgend eine Richtung hin abfeuern soll.
Der Spieler ist derjenige, der das in die Wege leitet und das Spiel, soll über ein Event erfahren, dass eine Einheit_1 in Richtung einer Einheit_2 geschossen hat.
Das Spiel soll ermitteln, ob Einheit_1 einen Treffer landen kann und wenn ja, dies mit einem Event der Einheiten 2 mitteilen.
Synonym zur ersten Antwort ganz oben von fajac habe ich das folgendermaßen umgesetzt:
Delphi-Quellcode:
type
TSpiel = class
private
_Spieler : TSpieler;
_sName : String;
_pVirtuelleWaffe : TWaffe;
procedure OnWaffeAbfeuernEvent (Sender : TObject; koAktuelleKoordinaten, koZielKoordinaten: TKoordinaten; iSchussEnergie:Integer);
public
constructor Create;
implementation
constructor TSpiel.Create;
begin
_pVirtuelleWaffe := TWaffe.Create('Waffe_1', TRUE, 0, 0, 100);
_pVirtuelleWaffe.OnWaffeAbfeuernEvent := OnWaffeAbfeuernEvent;
_Spieler := TSpieler.Create(iMENSCH, 0, 'Frank', clYellow);
_sName := 'TestSpiel';
end;
procedure TSpiel.OnWaffeAbfeuernEvent(Sender : TObject; koAktuelleKoordinaten, koZielKoordinaten: TKoordinaten; iSchussEnergie: Integer);
begin
// Wird aufgerufen wenn in TWaffe "Feuern" durchlaufen wird.
ShowMessage('Jetzt hat das auch mein Spiel bemerkt. Es hat das "OnWaffeAbfeuernEvent" erhalten.');
end;
Delphi-Quellcode:
type
TWaffe = class
private
_sName : String;
_bFunktionsbereit : Boolean;
_iMasse : Integer;
_iPreis : Integer;
_iZustand : Integer;
fWaffeAbfeuernEvent: TWaffeAbgefeuert_Event;
public
constructor Create(sNameDerWaffe: String; bWaffeFunktionsbereit: Boolean; iMasse: Integer; iNeuPreis: Integer; iProzentZustand: Integer);
property OnWaffeAbfeuernEvent: TWaffeAbgefeuert_Event read fWaffeAbfeuernEvent write fWaffeAbfeuernEvent;
procedure Feuern(koAktuelleKoordinaten, koZielKoordinaten: TKoordinaten; iSchussEnergie: Integer); virtual;
implementation
procedure TWaffe.Feuern(koAktuelleKoordinaten, koZielKoordinaten: TKoordinaten; iSchussEnergie: Integer);
begin
//ToDo -oWaffe -cCODE: Waffen.Feuern(Wohin: TKoordinaten; iEnergie: Integer)
if Assigned(fWaffeAbfeuernEvent) then begin
fWaffeAbfeuernEvent(self, koAktuelleKoordinaten, koZielKoordinaten, iSchussEnergie);
end;
ShowMessage('Jetzt fängt meine Waffe an, wie wild, in der Gegend herum zu ballern...!');
end;
Wie der versierte Delphianer erkennt, möchte ich nach dem Druck auf den Feuerknopf zwei MessageBoxen sehen. In der ersten soll stehen, dass die Waffe wie wild rum ballert und in der zweiten soll stehen, dass das Spiel davon weiß!!
Delphi-Quellcode:
procedure TfrmStartGBH.FeuerButtonClick(Sender: TObject);
var
slWaffenListe
: TStringList;
pWaffe
: TWaffe;
koStart, koZiel
: TKoordinaten;
pSpiel
: TSpiel;
pSpieler
: TSpieler;
pAktiveEinheit
: TEinheit;
begin
try
pSpiel := TSpiel.Create;
slWaffenListe := TStringList.Create;
pSpiel.GibSpieler(pSpieler);
pAktiveEinheit := pSpieler.GibAktiveEinheit;
pAktiveEinheit.GibWaffenListe(slWaffenListe);
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);
end else begin
pWaffe := (slWaffenListe.Objects[0])
as TWaffe;
end;
koStart := TKoordinaten.Create(0, 0);
koZiel := TKoordinaten.Create(1, 1);
pWaffe.Feuern(koStart, koZiel, 500);
except
on e:
Exception do begin
lLogger.LogFmt('
Exception: %s.', [e.
Message], llError);
end;
end;
{*** TfrmStartGBH.FeuerButtonClick ***}
end;
Tatsächlich erhalte ich aber nur eine Messagebox, nämlich die Vollzugsmeldung meiner Waffe!
Das Spiel kriegt davon offenbar nichts mit.
Weiß jemand, warum nicht?
Schon mal vielen Dank im Voraus.