Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

11

15.04.2011, 10:48

Aber beim abfeuern weißt du ja vorher nicht wenn du triffst, also wenn es mehrere Sachen zu treffen gibt^^ Und so werden einfach alle Objekte informiert und erfahren ob sie getroffen wurden ;)


@Key-Events: Bei mir kennt die jeweilige Klasse nur das Key-Event, sie weiß nicht von wem das verschickt wurde. Bei mir ist das so das die Klassen die Events abfangen, nur die Events kennen müssen ;) Registriert wird sich dabei global.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

12

15.04.2011, 10:52

Und wie registrieren sie sich "global"? Dazu müssen sie ja doch die Klasse kennen, die die Events auslöst. Oder wie machst Du das?

@weapon_fired:
Aber wenn es schon einen Manager gibt, der allen mitteilt, dass geschossen wurde, wozu genau dient da ein Event? Das kann er ihnen doch auch direkt per Methoden-Aufruf mitteilen. Weißt, was ich meine? Oder er kann den Manager auch gleich weglassen und sich "global" am weapon_fired Event der (Ober-)Klasse registrieren.
Bei mir ist das eher andersrum: Die Welt registriert sich bei mir am WeaponFired Event der Spieler, damit sie informiert wird, wenn geschossen wird und diese Schuss verwaltet.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

13

15.04.2011, 10:58

Bei mir gibts pro Thread eine EventLoop, bei der man sich mit seiner Callback-Funktion registrieren kann. Schon muss man nicht die Klasse kennen die das Event sendet.

@weapon_fired: Er hat doch nur geschrieben das er einen EventManager hat, der sich darum kümmern soll die Events zu senden? So weit wie ich das verstanden habe gibt es keinen Manager der allen mitteilt das geschossen wurde.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

14

15.04.2011, 11:06

Siehste. Und ich finde eben nicht, dass ein Objekt den Event-Loop kennen sollte. Egal wie man es aufzieht, da ist eine Verbindung drin, die eigentlich nicht existieren dürfte. Technisch mag das ja prima funktionieren, rein logisch betrachtet halte ich das aber für schlechtes Design.

@weapon_fired: Das ist ein Widerspruch. Entweder gibt es einen, der sich darum kümmert die Events zu senden und somit allen mitzuteilen, dass geschossen wurde oder nicht. Der Manager kann nicht gleichzeitig alle informieren und sie dabei NICHT informieren. Das geht irgendwie nicht ;)
Wenn also der Manager alle weapon_fired Events verwaltet und versendet, dann macht er das und teilt ja eben doch allen (die sich registriert haben) mit, dass geschossen wurde. Aber wieso er da den Manager braucht, das ist noch immer offen.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

15

15.04.2011, 11:14

Naja irgendwie muss ich ja die Verbindung aufbauen ;) Die Eventloop hat aber weiter keine Verbindung zu dem Sender/Empfänger, zum Empfänger mehr als zum Sender.
Und irgendjmd muss ja wissen das es jmden gibt der sich auf ein Event registriert hat.
Der Sender weiß ja auch nie wieviele Empfänger es gibt und das braucht ihn ja auch nicht zu interessieren ;)

Also wenn du ne bessere Idee hast, immer her damit :D

@weapon_fired: Müssen wir mal abwarten wie er das bisher hat^^

Schorsch

Supermoderator

  • »Schorsch« ist der Autor dieses Themas

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

16

15.04.2011, 11:48

Naja meine Eventbeispiele waren nicht so dolle;) Sollten nur dumme Beispiele sein. Das ganze System dahinter habe ich aus mehreren Büchern zusammengesetzt. Zum Teil wird es mal mit irgendwelchen Nachrichten gelöst und zum Teil halt mal über Events. Die Codes dazu waren bis jetzt immer in C++ weshalb ich noch garnicht drüber nachgedacht habe da mit den C# eigenen Events zu arbeiten. Aber darum gehts auch erstmal nicht;) Der EventManager macht für mich insofern Sinn, als dass ich dadurch eine gut erweiterbare Basis besitze. Dazu aber gleich mehr. Wenn ich zum Beispiel eine Viewklasse habe, sollte diese natürlich auf so gut wie alles reagieren. Zum Beispiel würde bei einem Schuss ein Sound abgespielt. Dazu vielleicht noch ein Partikelsystem. Zusätzlich müsste bei dem Event natürlich ein Objekt für den Schuss erzeugt werden. Wären 2 kleine Beispiele für Klassen die es interessieren würde über so etwas informiert zu werden. Wenn ich jetzt den Methodenaufruf direkt einbaue, dann müsste bei jedem Schuss jede Klasse informiert werden, die sich dafür interessieren könnte. Das könnte man dann natürlich über einen einfachen Observer regeln, dafür müsste dann jedoch jede Klasse die sich dafür interessiert die Klasse kennen, die den Schuss auslöst. Da diese Klassen sich natürlich für mehrere "Events" interessieren wären dadurch unschöne Abhängigkeiten drin. Vorallem eine Viewklasse müsste zu viel über andere Klassen wissen. Der weitere Vorteil ist, dass wenn die Steuerung etc über diese "Events" geregelt wird, eine Netzwerkkomponente relativ einfach zu implementieren ist. Ob ein Event nun von einer lokalen Komponente oder aus dem Netzwerk kommt, ist ja erstmal völlig egal. Zusätzlich habe ich dann durch die Queue im Eventmanager den Vorteil, dass nicht jedes Event direkt gesendet werden muss, sondern einmal pro Zyklus die alles gepackt werden kann und gesendet wird. Der Eventmanager bietet zusätzlich eine Schnittstelle, um alle Events und somit den gesamten Workflow zu loggen, was meiner Meinung nach auch sehr von Vorteil ist. Für mich sind die Vorteile von einer Schnittstelle für die Events doch recht klar. Lasse mich aber auch gerne von anderem Überzeugen.
Also vom Prinzip:

Objekt sendet Event an EventManager.
EventManager löst einmal pro Zyklus alle enthaltenen Events aus und benachrichtigt für jedes Event die registrierten Eventlistener.
Die Eventlistener verarbeiten die Events weiter und reichen sie an die untergeordneten Objekte weiter.

Meiner Meinung nach ein sehr lose gekoppeltes System, mit großem Potential zur Erweiterung. Das sollte das meiste geklärt haben.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Schorsch

Supermoderator

  • »Schorsch« ist der Autor dieses Themas

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

17

15.04.2011, 12:47

Habe grad nochmal die Posts überflogen. Zero beschreibt das Problem ganz gut. Beim registrieren sollen nicht alle Sender bekannt sein. Ich melde mich lieber beim EventManager an und bekomme dann die gewünschten Events und mir ist egal woher. Ein Event kann ja von verschiedenen Sendern die teils auch verschiedene Typen haben kommen. Und natürlich werden nicht bei jedem Event alle Listener benachrichtigt, sondern nur die die sich für das Event eingetragen haben. Sowas wie EventManager(Listener, EventType) mit dem der Listener sagen kann, dass er bei allen Events von diesem Typ benachrichtigt werden will. Ich denke der Manager ist schon recht Sinnvoll. Nach ein wenig Überlegung zu den Callbacks fällt mir jedoch keine Sinnvolle Möglichkeit ein, diese zu benutzen. Ist zugegeben auch ein Thema, mit dem ich mich bis jetzt wenig auseinandersetzen musste. Aber sollte so in das System schwer zu integrieren sein. Naja mal abwarten. Vielleicht habt ihr ja noch die Idee;)
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

18

15.04.2011, 15:24

Wie meinst das mit den Callbacks, also die Verwendung?

Naja ich sehe bei der reinen Callback-Funktion den Vorteil, das du nicht erst von einer Klasse ableiten musst, die halt schon alle Funktionen parat hat.
Dann kannst du halt auch noch die Funktionen nennen wie du möchtest und hast nicht immer "OnKeyDown" oder so, sondern etwas was da besser reinpasst^^

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

19

15.04.2011, 15:43

Ich finde das ganze System noch immer sehr merkwürdig. Ich verstehe zwar, dass du alles gern zentral halten willst, aber das ist
1) irgendwie meiner Meinung nach kein gutes Konzept, es riecht stark nach überflüssigem Manager
und
2) geht das irgendwie gegen den Sinn der Objekt-Orientierung, wenn alles eh immer nur auf den Manager angewiesen ist.

Das Beispiel mit dem Sound beim Schuss ist mir auch unklar. Was genau hat da jetzt der Manager mit zu tun und warum erzeugt der Schuss nicht den Ton selber?

Kann es sein, dass die große Verwirrung hier durch das Wort "Event" entsteht? Ein Event ist bei mir ein Ereignis, etwas, was irgendwann mal eintritt. Deiner Beschreibung nach sind es wohl eher "Actions", also eine Verwaltung von Aktionen, die durchgeführt werden müssen. Das würde auch deutlich mehr zu deiner Beschreibung mit dem Netzwerk passen. Denn andere Spieler müssen ja nicht über Events informiert werden, sondern über Aktionen im Spielverlauf.


@Zero: Eine Lösung zu Deinem Problem mit den Keys nannte ich ja schon. Der Controller übergibt die Keys an die Welt und diese weiter an die Objekte. Klar, der Vorteil mit der freien Methoden-Namens-Vergabe fällt dabei natürlich flach. Aber das ist zumindest eine logisch korrekte Abhängigkeit. Denn wieso genau sollte ein Objekt die Key-Verwaltung kennen? Ist für mich nicht schlüssig. Funktional aber auf jeden Fall.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

20

15.04.2011, 15:54

Naja von dem Manager von dem er immer redet, der kümmert sich ja nur um die Events, also um diese auszuliefern, den interessiert nicht ob das nun ein Schuss ist oder ob vll eine Taste gedrückt wurde.
Es muss ja eine zentrale Stelle geben wo man sich registrieren kann/ Events senden kann. Also mir fällt anders kein Ansatz an wie man sonst Events schicken soll, weil irgendwo muss es ja gespeichert werden.
Ich finde Events auch von der Seite her besser, warum sollte z.B. den Keylistener interessieren wer alles wissen welche Keys gedrückt wurden? Oder warum muss vorher festehen wer alles wissen will das geschossen wurde?

Z.B. könnte der Schuss ja einfach ein Event schicken, aktiviere Sound XY, muss aber nicht wissen wer das nun macht, er weiß einfach nur das sich jmd drum kümmern wird, oder halt nicht^^ Er muss dann nicht extra die Instanz vom SoundManager holen/speichern, sondern der bekommt einfach ein Event das er nen Sound spielen soll und dem ist ja auch egal wer das möchte.

Netzwerk würde ich da aber auch erstmal vollkommen noch rausnehmen und einzeln behandeln, weil so Events über Netzwerk ist immer nen bisschen Tricky und so^^

Werbeanzeige