AGB  ·  Datenschutz  ·  Impressum  







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

Wie eigene Ereignisse in Klassen?

Ein Thema von Igotcha · begonnen am 5. Okt 2005 · letzter Beitrag vom 6. Okt 2005
Antwort Antwort
Igotcha

Registriert seit: 22. Dez 2003
544 Beiträge
 
Delphi 2006 Professional
 
#1

Wie eigene Ereignisse in Klassen?

  Alt 5. Okt 2005, 15:29
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
  Mit Zitat antworten Zitat
Oxmyx

Registriert seit: 21. Sep 2004
499 Beiträge
 
#2

Re: Wie eigene Ereignisse in Klassen?

  Alt 5. Okt 2005, 16:09
Eine Funktion, die eine Nachricht empfängt, deklarierst du so:
procedure GetDamage(...); message MSG_GET_DAMAGE; Zum Senden von Nachrichten gibt's die Funktion SendMessage.
  Mit Zitat antworten Zitat
Tyrael Y.

Registriert seit: 28. Jul 2003
Ort: Stuttgart
1.093 Beiträge
 
Delphi 2007 Professional
 
#3

Re: Wie eigene Ereignisse in Klassen?

  Alt 5. Okt 2005, 16:12
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
Levent Yildirim
Erzeugung von Icons aus Bildern:IconLev
  Mit Zitat antworten Zitat
Thorben77

Registriert seit: 22. Okt 2004
359 Beiträge
 
#4

Re: Wie eigene Ereignisse in Klassen?

  Alt 5. Okt 2005, 16:17
Moin.

Dazu kannst du dir das auch mal angucken: Funktions- und Methodenzeiger
  Mit Zitat antworten Zitat
tigerman33

Registriert seit: 30. Jul 2005
Ort: München
423 Beiträge
 
Delphi 2005 Professional
 
#5

Re: Wie eigene Ereignisse in Klassen?

  Alt 5. Okt 2005, 16:50
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.
Christian
Der Computer hilft mir, Probleme zu lösen, die ich ohne Computer nicht hätte.
  Mit Zitat antworten Zitat
Igotcha

Registriert seit: 22. Dez 2003
544 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Wie eigene Ereignisse in Klassen?

  Alt 6. Okt 2005, 08:16
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
  Mit Zitat antworten Zitat
Oxmyx

Registriert seit: 21. Sep 2004
499 Beiträge
 
#7

Re: Wie eigene Ereignisse in Klassen?

  Alt 6. Okt 2005, 09:09
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.
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#8

Re: Wie eigene Ereignisse in Klassen?

  Alt 6. Okt 2005, 09:32
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
  Mit Zitat antworten Zitat
dragi

Registriert seit: 22. Jul 2003
198 Beiträge
 
Delphi 2005 Personal
 
#9

Re: Wie eigene Ereignisse in Klassen?

  Alt 6. Okt 2005, 10:11
@ 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
Delphi 3 Professional @home
Delphi 2005 PE @home
Delphi 2005 Enterprise @work
  Mit Zitat antworten Zitat
tigerman33

Registriert seit: 30. Jul 2005
Ort: München
423 Beiträge
 
Delphi 2005 Professional
 
#10

Re: Wie eigene Ereignisse in Klassen?

  Alt 6. Okt 2005, 11:44
Ich benutz sowas in einem meiner projekte. häng mal die unit an.
Angehängte Dateien
Dateityp: pas uchangenotifier_197.pas (3,1 KB, 21x aufgerufen)
Christian
  Mit Zitat antworten Zitat
Antwort Antwort


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 21:59 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