AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Objekt Kommunikation

Ein Thema von peschai · begonnen am 2. Jul 2009 · letzter Beitrag vom 19. Okt 2009
Antwort Antwort
Seite 2 von 2     12   
fajac

Registriert seit: 1. Jul 2009
60 Beiträge
 
#11

Re: Objekt Kommunikation

  Alt 19. Okt 2009, 09:07
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;
  Mit Zitat antworten Zitat
Benutzerbild von Glühwürmchen
Glühwürmchen

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

Re: Objekt Kommunikation

  Alt 19. Okt 2009, 09:17
So geht es leider nicht:
Im Strukturfenster schreibt Delphi:
Zitat:
Nicht deklarierter Bezeichner 'OnWaffeAbfeuernEvent'
Und der Compiler meldet:
Zitat:
[Pascal Fehler] frmStartseite.pas(106): E2003 Undefinierter Bezeichner: 'OnWaffeAbfeuernEvent'
Gruß Glühwürmchen
<><
  Mit Zitat antworten Zitat
fajac

Registriert seit: 1. Jul 2009
60 Beiträge
 
#13

Re: Objekt Kommunikation

  Alt 19. Okt 2009, 09:20
Sorry, es muss wohl heißen:
pWaffe.OnWaffeAbfeuernEvent := pSpiel.OnWaffeAbfeuernEvent; Dazu musst du allerdings die Prozedur TSpiel.OnWaffeAbfeuernEvent public machen.
  Mit Zitat antworten Zitat
Benutzerbild von Glühwürmchen
Glühwürmchen

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

Re: Objekt Kommunikation

  Alt 19. Okt 2009, 09:25
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 !
Gruß Glühwürmchen
<><
  Mit Zitat antworten Zitat
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
Benutzerbild von Glühwürmchen
Glühwürmchen

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

Re: Objekt Kommunikation

  Alt 19. Okt 2009, 12:20
Noch eine Anmerkung am Schluss:

In dieser Zeile des Feuer-Buttons vom Formular
Delphi-Quellcode:
  iAnzElem := pAktiveEinheit.GibWaffenListe(slWaffenListe);
  if (not Assigned(slWaffenListe)) or (slWaffenListe.count = 0) then begin
wird es je nach Einstellung in den Projektoptionen evtl. zur Exception kommen:

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!
Gruß Glühwürmchen
<><
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:30 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz