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
 
#8

Re: Objekt Kommunikation

  Alt 17. Okt 2009, 17:36
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.
Gruß Glühwürmchen
<><
  Mit Zitat antworten Zitat