Einheitensteuerung
Verfasst: 13.09.2011, 14:15
Ich entwickle gerade einen kleinen Zombieshooter. Jetzt frage ich mich, wie ich am besten die Logik für die Zombies (und auch den Spieler) umsetzen soll.
Die Sache ist die, dass man zwar rum rumläuft und auf Zombies schießt, aber trotzdem sollen die Kämpfe relativ komplex sein. Zum Beispiel können Spieler und Zombies stürzen, (zum Beispiel weil sie getroffen wurden) und dann wieder aufstehen, oder in Falle eines verwundeten Zombies auch mal ohne Beine über den Boden robben. Zombies sollen den Spieler auch packen können wodurch er sich erst losreißen muss und so weiter.
Ansich ist das ja alles leicht zu programmieren, ich weiß nur noch nicht so ganz, wie genau ich es am schönsten machen soll. Es hört sich ja vielleicht ein wenig nach Statemachine an, man kann rumlaufen, angreifen, tot rumliegen und so weiter. Allerdings möchte man ja auch im Laufen angreifen können, aber eben nicht, während man gerade durch einige Treffen nach hinten taumelt. Es gibt also irgendwie eine Reihe an Zuständen beziehungsweise Aktionen, die man gleichzeitig oder eben nur exklusiv ausführen kann. Das ganze soll halt möglichst flexibel gestaltet sein, einmal wegen der übersicht und zum anderen, weil man bei einem so komplexen System ja bestimmt prima komsiche Bugs einbauen kann, bei denen dann plötzlich Dinge passieren, die eigentlich nicht möglich sein sollten.
Zur Lösung hatte ich jetzt verschiedene Ideen. Einerseits könnte es eine Trennung von Zuständen und Aktionen geben. Ein Zustände wäre dann etwas wie stehen, gehen oder liegen, Aktionen so etwas wie 'Auf Treffer reagieren' angreifen, 'Gegenstände aufheben'. Man könnte dann jeder Aktion zuordnen in welchem Zustand sie nur ausgeführt werden kann, und dann Zustands ober Aktionswechsel erzwungen oder normal ausführen (man kann sich während dem Treten nicht hinlegen, aber wenn man umgeschmissen wird, wird halt die Tritt-Aktion unterbrochenen und hat dann keinen Effekt mehr).
Eine andere Idee war es, für Aktion zu definieren, welche Arme/Beine/Hände gebraucht werden. Man bräuchte zum laufen also nur die Beine, hat also die Arme zum Angreifen frei. Wenn man am Boden liegt, kann man auf allen Vieren robben, und dann also nicht angreifen, bis man still liegt. Man könnte dann mit einer einhändigen Waffe mit der anderen Hand Objekte aufheben, mit einer Zweihändigen eben nicht. Der Vorteil dabei ist natürlich, wenn für jede Aktion die Benötigten Extremitäten bekannt sind, sollte man auch recht gut die Animationen überblenden können. Man bräuchte also keine LaufAngriff Animation, sondern weiß, dass man Laufen und Angreifen gleichzeitig abspielen kann, weil sie eben keine gemeinsamen Knochen benutzen.
Andererseits ist auch die Frage, ob man so etwas kleines wie Aktionen als eigene Klassen programmieren sollte. Im Zweifelsfalle hat man da manchmal doch nur 3 Zeilen Code, aber 2 Dateien mit 40 Zeilen nur um das ganze drumherum zu haben. Das ganze als einen quasi monolithischen Codeblock umzusetzen könnte schnell gehen und kompakt sein, die Frage ist halt nur, wie Erweiterbar und Bugfrei so etwas bleiben würde.
Die Sache ist die, dass man zwar rum rumläuft und auf Zombies schießt, aber trotzdem sollen die Kämpfe relativ komplex sein. Zum Beispiel können Spieler und Zombies stürzen, (zum Beispiel weil sie getroffen wurden) und dann wieder aufstehen, oder in Falle eines verwundeten Zombies auch mal ohne Beine über den Boden robben. Zombies sollen den Spieler auch packen können wodurch er sich erst losreißen muss und so weiter.
Ansich ist das ja alles leicht zu programmieren, ich weiß nur noch nicht so ganz, wie genau ich es am schönsten machen soll. Es hört sich ja vielleicht ein wenig nach Statemachine an, man kann rumlaufen, angreifen, tot rumliegen und so weiter. Allerdings möchte man ja auch im Laufen angreifen können, aber eben nicht, während man gerade durch einige Treffen nach hinten taumelt. Es gibt also irgendwie eine Reihe an Zuständen beziehungsweise Aktionen, die man gleichzeitig oder eben nur exklusiv ausführen kann. Das ganze soll halt möglichst flexibel gestaltet sein, einmal wegen der übersicht und zum anderen, weil man bei einem so komplexen System ja bestimmt prima komsiche Bugs einbauen kann, bei denen dann plötzlich Dinge passieren, die eigentlich nicht möglich sein sollten.
Zur Lösung hatte ich jetzt verschiedene Ideen. Einerseits könnte es eine Trennung von Zuständen und Aktionen geben. Ein Zustände wäre dann etwas wie stehen, gehen oder liegen, Aktionen so etwas wie 'Auf Treffer reagieren' angreifen, 'Gegenstände aufheben'. Man könnte dann jeder Aktion zuordnen in welchem Zustand sie nur ausgeführt werden kann, und dann Zustands ober Aktionswechsel erzwungen oder normal ausführen (man kann sich während dem Treten nicht hinlegen, aber wenn man umgeschmissen wird, wird halt die Tritt-Aktion unterbrochenen und hat dann keinen Effekt mehr).
Eine andere Idee war es, für Aktion zu definieren, welche Arme/Beine/Hände gebraucht werden. Man bräuchte zum laufen also nur die Beine, hat also die Arme zum Angreifen frei. Wenn man am Boden liegt, kann man auf allen Vieren robben, und dann also nicht angreifen, bis man still liegt. Man könnte dann mit einer einhändigen Waffe mit der anderen Hand Objekte aufheben, mit einer Zweihändigen eben nicht. Der Vorteil dabei ist natürlich, wenn für jede Aktion die Benötigten Extremitäten bekannt sind, sollte man auch recht gut die Animationen überblenden können. Man bräuchte also keine LaufAngriff Animation, sondern weiß, dass man Laufen und Angreifen gleichzeitig abspielen kann, weil sie eben keine gemeinsamen Knochen benutzen.
Andererseits ist auch die Frage, ob man so etwas kleines wie Aktionen als eigene Klassen programmieren sollte. Im Zweifelsfalle hat man da manchmal doch nur 3 Zeilen Code, aber 2 Dateien mit 40 Zeilen nur um das ganze drumherum zu haben. Das ganze als einen quasi monolithischen Codeblock umzusetzen könnte schnell gehen und kompakt sein, die Frage ist halt nur, wie Erweiterbar und Bugfrei so etwas bleiben würde.