Design: Spagat zwischen zyklischer und eventbasierter Abarbeitung



  • Hallo!

    Ich bastele seit längerem zum Zeitvertreib/Lernen an einem MMORPG Abklatsch. Ich habe einen Client und einen Server. Im Server wird alle 50ms die Spielewelt neu berechnet, d.h. für den Player wird beispielsweise geprüft welche anderen Player in seinem Sichtradius stehen, wenn neue gefunden werden, wird ein entsprechendes Kommando (was hat der Spieler für Ausrüstungsgegenstände, etc.) an den zum Player gehörenden Client geschickt um den anderen Player sichtbar werden zu lasen ("spawnen").

    Offensichtlich geschieht das spawnen zyklisch. Unter "eventbasiert" würde ich verstehen, wenn bei jeder Bewegung von irgendjemand in der Spielewelt gegenüber den anderen Playern geprüft werden würde, ob man sich im Sichtbarkeitsradius befindet. Hier finde ich die Entscheidung einfach, zu sagen, dass ich dies eher zyklisch machen möchte.

    Ein anderes Beispiel ist ein Kampf zwischen zwei Playern. Dies mache ich, in dem wenn jemand den Angriffsbefehl gibt ein Objekt erstellt wird, welches den Kampf repräsentiert. Dieses Objekt kennen beide Player-Objekte und auch das Kampfobjekt kennt die beteiligten Player, um diesen bei Bedarf Schadenspunkte zuzufügen.
    Jetzt könnte z.B. ein Spieler einfach ausloggen. Beim Ausloggen muss der Kampf beendet werden. Ich schwanke jetzt zwischen 2 Möglichkeiten:
    a) zyklisch: Der Spieler loggt aus, der Kampf wird beim "Auslog-Event" als beendet markiert (interner State vom Kampf wird z.B. auf sowas wie "ZOMBIE" geändert). Beim nächsten Zyklus würde der andere Spieler prüfen, ob der Kampf weiterhin "OK" ist oder "ZOMBIE" ist beendet vorzeitig werden muss.

    b) eventbasiert: Der Kampf wird direkt beendet. Da der Kampf seine beteiligen Spieler kennt, könnte dieser, wenn der eine Gegner ihn beendet, auf dem anderen Gegner eine Funktion aufrufen um ihn davon zu unterrichten. Im nächsten Zyklus würde daher nichts weiter passieren.

    Ich tendiere in diesem Fall zu Lösung b). Habe aber keinen triftigen Grund es so zu machen, ausser dass mir mein Gefühl sagt, dass ich auf ein Event gerne alles tun würde, was direkt daraus folgt (also Kampf beenden, beim Gegner entsprechende Funktionen aufrufen, damit auch dort der Kampf sauber beendet wird). Entscheidungen würde ich tendenziell lieber zyklisch treffen (z.B. Auswahl eines neuen Gegners - ansonsten hätte man dies natürlich auch direkt in Anschluss an b) machen können).
    Beim drüber Schreiben ist mir jetzt doch noch ein Grund eingefallen. Die zyklische Abfrage würde lauten "kein Gegner? -> Gegner suchen". Und dies wäre das Einzigste was man tun müsste. Im eventbasierten Fall hätte ich "neuen Gegner suchen" über zig Stellen verteilt (wenn der Kampf zu Ende ist, wenn gerade jemand in den Sichtradius spawnt, wenn ein Sack Reis umfällt, ...)

    Wie sieht ihr das? Gibt es vielleicht irgendwelche Tips oder Best Practices um zu einer guten Entscheidungen bezüglich der Problematik bei solchen unscharf gelagerten Fällen zu kommen?
    In GUIs (die sowieso eventbasiert sind), stellt sich die Frage ja gar nicht. Hier ist die Schwierigkeit für mich eine Entscheidung zu treffen, weil viele Objekte eh eine Art "Trigger" oder "Execute" Funktion haben, weil eben manche Dinge nur zyklisch gemacht werden können (im Falle des Kampfes z.B. "alle x Triggers y Punkte Feuer-Schaden").



  • Ich habe grad' noch gesehen, dass mein Argument für das zyklische "Gegner suchen" natürlich komplett am eigenen Thema vorbei war. Ist ja keine Antwort auf die Frage ob man sowas wie den Kampf jetzt besser eventbasiert oder nach einer zyklischen Prüfung beenden sollte. sorry.


Anmelden zum Antworten