Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Wie eigene Ereignisse in Klassen? (https://www.delphipraxis.net/54505-wie-eigene-ereignisse-klassen.html)

Igotcha 5. Okt 2005 16:29


Wie eigene Ereignisse in Klassen?
 
Hallo zusammen,

ich möchte ein kleines Spiel schreiben und bin gerade dabei, die entsprechenden Klassen für die einzelnen Einheiten und Individuen zu schreiben (eine Einheit kann mehrere Individuen besitzen). Da ich diese Individuen so "intelligent" wie möglich gestalten will, habe ich mir gedacht, ich lasse sie (die Objekte) u.a. auf Ereignisse reagieren.

Nehmen wir mal an, ein Individuum ist ein Soldat. Dieser soll z.B. innerhalb seiner Einheit laufen können (kein Problem). Wenn jetzt aber Gegner in seiner Reichweite sind, soll er sich anders verhalten, er soll also z.B. auf ein Ereignis "OnEnemyNear" reagieren. Genauso sollen z.B. seine Lebenspunkte reduziert werden, wenn er Schaden erleidet - z.B. mit

Delphi-Quellcode:
procedure OnGetDamage(aEnemy: TUnit, aDmg: Integer).
begin
      Hitpoints:=Hitpoints-aDmg;
      if HitPoints<0 then
         Dead;
      If InCombatRange(aEnemy)=true then
         Attack(aEnemy)
      else
         MoveTo(aEnemy);
end;
Wie setze ich so etwas um, dass diese Events überhaupt stattfinden und dann auch die Objekte auf diese reagieren können?

TUnit könnte z.B. eine procedure "DoDamageToUnit(aUnit, aDmg)" besitzen, wie kann aber die empfangende TUnit dieses Event abfragen?

Es geht also darum, wie ich nicht-Systemnachrichten erstellen und darauf reagieren kann.

Gruß Igotcha

Oxmyx 5. Okt 2005 17:09

Re: Wie eigene Ereignisse in Klassen?
 
Eine Funktion, die eine Nachricht empfängt, deklarierst du so:
Delphi-Quellcode:
procedure GetDamage(...); message MSG_GET_DAMAGE;
Zum Senden von Nachrichten gibt's die Funktion SendMessage.

Tyrael Y. 5. Okt 2005 17:12

Re: Wie eigene Ereignisse in Klassen?
 
Hallo, mal auf die schnelle...

Delphi-Quellcode:
  TSoldat = class
  private
    FOnGetDamage: TNotifyEvent;
    ...
  protected
    DoOnGetDamage(Sender: TObject);
  public
    ...
    property OnGetDamage: TNotifyEvent read FOnGetDamage write FOnGetDamage;
  end;

...

implementation

procedure TSoldat.DoOnGetDamage(Sender: TObject);
begin
  if Assigned(FOnGetDamage) then
    FOnGetDamage(self);
  ...
end;
und beim benutzen....

Delphi-Quellcode:
 ...
  LSoldat := TSoldat.Create();
  LSoldat.OnGetDamage := MakeDamage;
 ...

 ...
 procedure MakeDamage(Sender: TObject);
 begin
      FHitpoints:=FHitpoints-FDmg;
      if FHitPoints<0 then
         Dead;
      If InCombatRange(FEnemy)=true then
         Attack(FEnemy)
      else
         MoveTo(FEnemy);
 end;
nur ein schnelles Bsp., hoffe du kommst klar


Gruß
Tyrael

Thorben77 5. Okt 2005 17:17

Re: Wie eigene Ereignisse in Klassen?
 
Moin.

Dazu kannst du dir das auch mal angucken: Funktions- und Methodenzeiger

tigerman33 5. Okt 2005 17:50

Re: Wie eigene Ereignisse in Klassen?
 
Ich glaube aber nicht, dass du für ein Spiel mit den Messages wirklich glücklich werden wirst. Die verbrauchen ja eine ganze Menge Systemperformance, während sie hin- und hergeschickt werden. Direkt mit den Instanzen zu arbeiten, dürfte da praktischer sein.

Igotcha 6. Okt 2005 09:16

Re: Wie eigene Ereignisse in Klassen?
 
Zitat:

Zitat von tigerman33
Ich glaube aber nicht, dass du für ein Spiel mit den Messages wirklich glücklich werden wirst. Die verbrauchen ja eine ganze Menge Systemperformance, während sie hin- und hergeschickt werden. Direkt mit den Instanzen zu arbeiten, dürfte da praktischer sein.

Tja, kann dazu jemand etwas aus der Praxis sagen?

Gruß Igotcha

Oxmyx 6. Okt 2005 10:09

Re: Wie eigene Ereignisse in Klassen?
 
Zitat:

Zitat von Igotcha
Tja, kann dazu jemand etwas aus der Praxis sagen?

Gruß Igotcha

Kaum ein Spiel verwendet das Windows-Nachrichtensystem. Anstatt z.B. eine GetDamage-Nachricht zu verschicken, kannst du auch gleich die entsprechende Funktion direkt aufrufen.

Der_Unwissende 6. Okt 2005 10:32

Re: Wie eigene Ereignisse in Klassen?
 
Hi,
ich würde dir auch dazu raten, einfach mal das Listener-Pattern (weiß net genau wie es richtig heißt) zu implementieren.
Dazu hälst du einfach in der Klasse, die ein Ereignis mitteilen möchte ein Array mit allen Listenern (Methodenszeiger) bereit. Über eine Prozedur (e.g. registerListener) registrierst du dann deine Methoden, die benachrichtigt werden sollen.
Wenn dann dein Ereignis eintritt iterierst du über dein Methodenzeiger Array das alle registrierten Listener enthält.
Ist denke ich für dein Problem deutlich besser geeignet als eigene Messages abzuschicken und zu empfangen

dragi 6. Okt 2005 11:11

Re: Wie eigene Ereignisse in Klassen?
 
@ Der_Unwissende

mich interessiert das Thema auch sehr aber deine Antwort ist mir irgendwie zu hoch. Kannst du diese vielleicht etwas verständlicher ausdrücken oder vielleicht ein kleines Codebeispiel machen? Wäre Klasse!

Vielen Dank

Dragi

tigerman33 6. Okt 2005 12:44

Re: Wie eigene Ereignisse in Klassen?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich benutz sowas in einem meiner projekte. häng mal die unit an.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:22 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