(gloabler) EventManager (und paar andere Sachen)



  • Hallo zusammen,

    ich arbeite zurzeit an einem Spiel und habe auch ein Buch dazu gelesen (Game coding complete). Eigentlich hat mir das Buch nicht besonders gefallen (u.A. wegen unmengen an C-Code und gewöhnungsbedürftigen Benennunskonventionen), aber eine Idee davon find ich doch vielversprechend.

    Dort wird vorgeschlagen, einen (globalen) EventManager zu benutzen, also jedes objekt kann sich dort für eine oder mehrere arten von bestimmten events registrieren und wird dann benachrichtigt, sobald ein anderes objekt ein solches event auslöst.
    Das ganze erleichter die "Kommunikation" zwischen objekten sehr stark, da nicht jeder eine referenz auf jeden anderen braucht usw.

    Was haltet ihr davon und wie würdet ihr es implementieren?

    Erstmal zur Globalität:
    Bisher verwende ich keine globalen variablen oder ähnliches, aber ich denke schon, dass es hier ausnahmsweise mal sinnvoll ist das ganze global zu machen, weil wirklich sehr viele objekte dadrauf zugriff brauchen und ständiges durchreichen lästig wird.

    Zur implementierung:
    Singleton oder statische Klasse?
    Ich tendiere zu einer statischen Klasse, weil ich im Singleton keine Vorteile sehe.

    Noch ein andere Sache:
    Sehr viele von meinen Objekten müssen auch wissen, ob man server oder client ist, bisher wird das durchgereicht, aber ich brauche die information in immer mehr objekten, deswegen überlege ich, ob ich dafür eine globale variable einführe.
    Normalerweise wird ja immer davon abgeraten, aber ist das hierbei wirklich so schlimm?

    Achja und falls ihr noch gute Bücher zur Spieleprorammierung kennt, bitte her damit 🙂
    Ich habe allerdings kein interesse an büchern, die fast nur über grafikprogrammierung, winapi o.Ä. handeln, mir gehts eher um die "high-level-struktur" eines spiel und vll noch darum, wie man internetfähige spiele entwickelt (auch hier kein interesse an low-level-socket-programmierung o.Ä.).



  • Q schrieb:

    Was haltet ihr davon und wie würdet ihr es implementieren?

    Erstmal zur Globalität:
    Bisher verwende ich keine globalen variablen oder ähnliches, aber ich denke schon, dass es hier ausnahmsweise mal sinnvoll ist das ganze global zu machen, weil wirklich sehr viele objekte dadrauf zugriff brauchen und ständiges durchreichen lästig wird.

    Zur implementierung:
    Singleton oder statische Klasse?
    Ich tendiere zu einer statischen Klasse, weil ich im Singleton keine Vorteile sehe.

    Ist ok. Aber ich würde es weder als statische Klasse noch als Singleton implementieren, noch es global machen! Mach halt eine ganz normale Klasse, von der du in deiner main() ein Objekt erstellst und die du dann im Loop ansprichst.

    Q schrieb:

    Noch ein andere Sache:
    Sehr viele von meinen Objekten müssen auch wissen, ob man server oder client ist, bisher wird das durchgereicht, aber ich brauche die information in immer mehr objekten, deswegen überlege ich, ob ich dafür eine globale variable einführe.
    Normalerweise wird ja immer davon abgeraten, aber ist das hierbei wirklich so schlimm?

    Ich würde eine einfach "Settings" Klasse erstellen und dazu ein globales (in einem Namespace) "MainSettings"-Objekt. Das ständige Durchreichen von x Programmeinstellungen trägt meiner Meinung nach weniger zur Lesbarkeit bei, als ein simples globales Objekt.


  • Mod

    Q schrieb:

    Hallo zusammen,

    ich arbeite zurzeit an einem Spiel und habe auch ein Buch dazu gelesen (Game coding complete). Eigentlich hat mir das Buch nicht besonders gefallen (u.A. wegen unmengen an C-Code und gewöhnungsbedürftigen Benennunskonventionen)

    normalerweise entscheidet man, gerade bei sachebuechern, nicht anhandd er gramatik, satzbauweise, syntax etc. ob man sie liest, sollte man auch so bei programmierbuechern machen. Wird selten der fall sein, dass zwei programmierer gleichen code style haben, dennoch kann das wissen hinter ungewohntem cdoe sehr wertvoll sein.

    aber eine Idee davon find ich doch vielversprechend.

    Dort wird vorgeschlagen, einen (globalen) EventManager zu benutzen, also jedes objekt kann sich dort für eine oder mehrere arten von bestimmten events registrieren und wird dann benachrichtigt, sobald ein anderes objekt ein solches event auslöst.
    Das ganze erleichter die "Kommunikation" zwischen objekten sehr stark, da nicht jeder eine referenz auf jeden anderen braucht usw.

    Was haltet ihr davon und wie würdet ihr es implementieren?

    wozu sollte man sowas selbst implementieren, gibt nur fehler und es verschwendet zeit, wo es doch ein paar gelaeufige libs gibt. mir ist so als ob die am meisten verwendete diese ist: http://libsigc.sourceforge.net/
    es gibt glaube ich auch boost::signals die das auch implementieren (kenn ich aber nur vom hoeren sagen).

    Noch ein andere Sache:
    Sehr viele von meinen Objekten müssen auch wissen, ob man server oder client ist, bisher wird das durchgereicht, aber ich brauche die information in immer mehr objekten, deswegen überlege ich, ob ich dafür eine globale variable einführe.
    Normalerweise wird ja immer davon abgeraten, aber ist das hierbei wirklich so schlimm?

    was soll die globale variable denn machen? es haengt doch von jedem objekt ab, wenn es nur eine globale variable fuer server udn client gibt, kann ich mir nicht vorstellen was das geben soll.



  • rapso schrieb:

    normalerweise entscheidet man, gerade bei sachebuechern, nicht anhandd er gramatik, satzbauweise, syntax etc. ob man sie liest, sollte man auch so bei programmierbuechern machen. Wird selten der fall sein, dass zwei programmierer gleichen code style haben, dennoch kann das wissen hinter ungewohntem cdoe sehr wertvoll sein.

    Ok da hast du recht, aber es geht nicht nur um diese sachen, da war noc hmehr.
    Seitenlange funktionen und jede menge low-level-zeugs, dass mich relativ wenig interessiert.
    Ich bin leider immer noch vergeblich auf der suche nach einem guten buch, dass einem hauptsächlich die high-level-konzepte der spieleprogrammierung zeigt.

    rapso schrieb:

    wozu sollte man sowas selbst implementieren, gibt nur fehler und es verschwendet zeit, wo es doch ein paar gelaeufige libs gibt. mir ist so als ob die am meisten verwendete diese ist: http://libsigc.sourceforge.net/
    es gibt glaube ich auch boost::signals die das auch implementieren (kenn ich aber nur vom hoeren sagen).

    Hab vergessen zu erwähnen, dass ich für das spiel inzwischen auf C# umgestiegen bin (früher war es in C++). Da gibt es delegates, also viele Fehler sollte es dabei nicht geben, es geht mir eher darum ob als normale klasse oder als singleton oder als statische klasse oder was auch immer^^

    rapso schrieb:

    was soll die globale variable denn machen? es haengt doch von jedem objekt ab, wenn es nur eine globale variable fuer server udn client gibt, kann ich mir nicht vorstellen was das geben soll.

    Im Grund brauche ich erstmal nur eine einfache globale bool-variable, die z.B. "IsServer" heißen könnte.
    Die wird nur einmal (direkt am start wird per konsole gefragt, ob server oder client) gesetzt und danach nur noch gelesen (aber von ziemlich vielen stellen aus.

    cooky451 schrieb:

    Ist ok. Aber ich würde es weder als statische Klasse noch als Singleton implementieren, noch es global machen! Mach halt eine ganz normale Klasse, von der du in deiner main() ein Objekt erstellst und die du dann im Loop ansprichst.

    Problem ist, dass, wenn es in der main loop sitzt, andere objekte sich nicht registrieren können, außer, wenn ich eine referenz darauf überall reinreiche.

    cooky451 schrieb:

    Ich würde eine einfach "Settings" Klasse erstellen und dazu ein globales (in einem Namespace) "MainSettings"-Objekt. Das ständige Durchreichen von x Programmeinstellungen trägt meiner Meinung nach weniger zur Lesbarkeit bei, als ein simples globales Objekt.

    Ok, werd ich vorraussichtlich so machen.



  • Und wieder krieg ich probleme mit sowas...

    Wenn ich einen Gegner machen will, der wenn er stirbt einen neuen Gegner spawnt, dann brauche ich dafür irgendwie eine Referenz auf die Level-Klasse.

    Dafür fallen mir 3 Möglichkeiten ein:
    1. Beim konstruieren mit übergeben und abspeichern
    2. Bei jedem Methodenauruf übergeben
    3. Das Level-Objekt global verfügbar machen

    Davon gefällt mir eigentlich alles nicht wirklich und ich werde einige fälle haben, bei denen ich in irgendeiner Art Zugriff auf das derzeitige Level-Objekt und auch auf einige andere Objekte brauche.
    Wie würdet ihr das lösen?


Anmelden zum Antworten