Entwicklerblog - Bewegung in RuneScape

Hallo! Ich bin Mod Nin. Wenn ihr bei den RuneScape-Ankündigungen beim RuneFest im Oktober reingeschaut habt, dann habt ihr ein paar technische Prototypen diverser Spielfeatures gesehen. Der Prototyp für flüssigere Bewegung wurde in einem Video vorgestellt, in dem ein Charakter durch das Baumgnomendorf-Labyrinth rennt und dabei geschmeidig wie eine Katze um die Kurven eilt. Diese Neuerung steht euch nun allen im Spiel bereit! Und falls ihr neugierig seid, erkläre ich euch, wie wir diese scheinbar einfache Änderung vorgenommen haben.

Um sie zu verstehen, müssen wir zunächst einmal behandeln, wie Bewegungen in RuneScape funktionieren. Dafür muss man ein bisschen davon verstehen, wie RuneScape allgemein funktioniert.

Wenn ihr RuneScape spielt, interagiert ihr mit dem Spielclient – dem Programm, das ihr auf euer Gerät heruntergeladen habt. Der Client verbindet sich mit dem Spielserver, der von uns bei Jagex betrieben wird. So unterscheiden die beiden sich voneinander:

  • Der Spielserver verarbeitet fast gänzliche Spiellogik (eure Fortbewegung, Scripts für Kampf und Fertigkeitstraining).
  • Die Spielclient stellt die Welt dar, wie sie auf dem Server existiert. Er kann euren Charakter nicht direkt bewegen, aber er kann dem Server sagen, ihn zu bewegen.
  • Wichtig ist hierbei, dass die Bewegung jedes Spielers und NSCs in RuneScape vom Spielserver kontrolliert wird. Alle 600 Millisekunden (ein sog. Spiel-Tick oder Server-Tick) aktualisiert der Server die Position eures Charakters und überträgt sie an euren Spielclient. Diese ist an einem Gitterraster ausgerichtet.

    Wenn nur das zu sehen wäre, würde sich euer Charakter sehr seltsam fortbewegen...

    Um die Bewegung natürlicher erscheinen zu lassen, berechnet der Spielclient Zwischenschritte zwischen eurer letzten und der nächsten Position und spielt eine nette Animation ab. Immer wenn der Client eine neue Position erhält, wird sie der 'ausstehenden Route' hinzugefügt, während derer Animationen in festgelegter Geschwindigkeit abgespielt werden – je nachdem ob man läuft, rennt oder kriecht. Sollte euer Charakter zu weit von der neuen Position entfernt sein, wird die Geschwindigkeit um einen festgelegten Betrag erhöht, bis sie erreicht wurde.


    Zeit für große Schritte!

    So funktionierte Fortbewegung im Spiel seit RuneScape 2 im Jahre 2004 veröffentlicht wurde. Bewegungen von Spielern und NSCs wurden dadurch adäquat widergespiegelt, aber es gibt definitiv noch Raum zur Verbesserung. Uns geht es hierbei nicht um fundamentale Eingriffe in das Bewegungssystem (tut uns leid, die rasterbasierte Fortbewegung bleibt vorerst!) – allerdings gibt es zwei Bereiche, die verbessert werden können:

  • 1. Charaktere beginnen und beenden ihre Bewegungen abrupt – ohne Beschleunigung oder Abbremsung – und die Geschwindigkeit ändert sich plötzlich inmitten des Laufens. Das ist besonders Übelkeit erregend, wenn man den klassischen Kameramodus verwendet.
  • 2. Beim Umdrehen laufen Charaktere sofort in die neue Richtung los. Der Richtungswechsel sieht dadurch unnatürlich und abgehackt aus.
  • Flüssigkeit/Beschleunigung/Abbremsung

    Anstatt Charaktere nur mit festgelegter Geschwindigkeit fortzubewegen, erhalten sie nun zusätzlich eine Beschleunigung. Wenn sie anfangen zu laufen, nimmt ihre Geschwindigkeit im Verlauf von 200 Millisekunden von 0 bis zur Endgeschwindigkeit zu. Wenn der Server keine weitere Bewegung mehr übermittelt, dann wird wieder auf 0 abgebremst. Dies tritt auch ein, wenn die Geschwindigkeit sich während der Bewegung verändert. Wenn dem Charakter die Laufenergie ausgeht und er langsamer wird, ist der Übergang nun etwas sanfter.

    Es ist uns außerdem gelungen, ein intelligenteres 'Aufhol'-System zu entwickeln. Wie vorhin erwähnt, wurden Charaktere plötzlich beschleunigt, wenn sie zu weit von ihrer Zielposition entfernt waren. Mit unserem neuen System zur Steuerung der Geschwindigkeit, können wir das alles etwas nahtloser erscheinen lassen, indem wir sie abhängig von der aufzuholenden Distanz erhöhen. Je länger die Route, desto schneller bewegt sich der Charakter fort – und wenn sich die Geschwindigkeit ändert, geschieht dies sachte. Das Aufholen sieht dadurch natürlicher aus und die Reaktionen auf eure Eingaben erscheinen dadurch auch etwas flüssiger; je näher wir euren Charakter am Ende der verbleibenden Route halten, desto schneller wird er seine aktuellste Position erreichen. Dies geschieht die ganze Zeit über und wenn ich meine Arbeit gut gemacht habe, sollte es euch nicht einmal auffallen!

    Richtungswechsel

    Beim Richtungswechsel wird es erst so richtig interessant. Wäre es nicht schön, wenn wir Kurven anstatt gerader Routen laufen könnten? Eine einfache und effektive Kurve hierfür ist die sogenannte Bézierkurve. Ohne allzu sehr ins Detail zu gehen: es handelt sich hierbei um eine parametrische Kurve, die durch Interpolation einer Reihe von Punkten errechnet wird. In unserem Fall haben wir drei Punkte pro Kurve, es handelt sich dabei also um eine quadratische Bézierkurve.


    Es ist allerdings nicht genug, vorhandene Punkte zu nehmen und sie in Kurven umzuwandeln. Das Ganze würde recht chaotisch enden, mit Kurven, die abhängig von unserem Startpunkt nicht ordentlich ausgerichtet und gelegentlich auch etwas enger als sonst wären. Euer Charakter würde dadurch vielleicht auch Haken schlagen oder durch Wände laufen und um das zu vermeiden, müssen wir etwas mehr Arbeit investieren.


    Um das zu Bereinigen, müssen wir ein paar mehr Zwischenpunkte berechnen. Wann immer wir eine neue Position vom Server erhalten, berechnen wir zusätzliche (je ein halbes Feld entfernte) Schritte, die zur neuen Position führen. Von jedem zweiten dieser Punkte aus wird dann eine Kurve berechnet, damit wir ein Feld immer so betreten und verlassen, dass dies einen schön ausgerichteten Pfad ergibt.


    Wunderbar! Jetzt haben wir ein paar schicke Kurven, an denen entlang wir interpolieren können. Wenn wir unseren Charakter fortbewegen, können wir die Geschwindigkeit entlang der Kurve ausrichten, mit sanfter Beschleunigung und sachtem Richtungswechsel! In der Praxis ist das alles etwas komplexer. (Was geschieht beispielsweise, wenn wir unsere nächste Position etwas spät erhalten und eine neue Kurve von der Mitte unserer letzen Kurve heraus berechnen müssen? Was, wenn wir nur zwei Punkte haben?) Allgemein sollte euch dies jedoch erklären, wie die neue Bewegung funktioniert.

    Das wäre das Ende unseres Beitrags. Ich hoffe, das Lesen hat Spaß gemacht. Bevor ich 2016 bei Jagex angefangen habe, habe ich die NXT-Blogbeiträge immer gern gelesen – ich hoffe daher, dass ein paar von euch das Ganze interessant fanden! Ich bin ein Mitglied von RuneScapes neuem 'Core Experience'-Team (Kernerlebnis im Spiel), das die generelle Spielerfahrung verbessern soll – macht euch also auf weitere derartige Verbesserungen gefasst!

    Mod Nin, Spiel-Engine-Programmierer

    Zurück nach oben