![]() |
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:
Wie setze ich so etwas um, dass diese Events überhaupt stattfinden und dann auch die Objekte auf diese reagieren können?
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; 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 |
Re: Wie eigene Ereignisse in Klassen?
Eine Funktion, die eine Nachricht empfängt, deklarierst du so:
Delphi-Quellcode:
Zum Senden von Nachrichten gibt's die Funktion SendMessage.
procedure GetDamage(...); message MSG_GET_DAMAGE;
|
Re: Wie eigene Ereignisse in Klassen?
Hallo, mal auf die schnelle...
Delphi-Quellcode:
und beim benutzen....
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;
Delphi-Quellcode:
nur ein schnelles Bsp., hoffe du kommst klar
...
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; Gruß Tyrael |
Re: Wie eigene Ereignisse in Klassen?
|
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.
|
Re: Wie eigene Ereignisse in Klassen?
Zitat:
Gruß Igotcha |
Re: Wie eigene Ereignisse in Klassen?
Zitat:
|
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 |
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 |
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 13:54 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz