Devlog #02 - Jetzt Kollidierts!

Das Motivations-Hoch hält an und seit dem letzten Devlog haben sich schon die nächsten 9 Commits auf dem Master-Branch niedergelassen. Eines meiner größten Sorgenkinder ist jetzt endlich mit allen wichtigen Kernfunktionen abgeschlossen, das benachrichtigen bei, erkennen von und reagieren auf Kollision! Damit alles richtig ineinander greift brauchte es viele Einzelschritte:

Variable Hitboxen

Dem alten System war es nicht ohne weiteres möglich während des Betriebs durch aktive Hitboxen durchzuschalten. 

Jetzt wird beim Anfordern von Hitboxen eines Actors eine Suche über die aktive Animation und selbst über deren aktives Einzelbild durchgeführt. Das heißt dass bspw. bei einem Kampfspiel bildgenau die Hitboxen der Bewegung des Charakters angepasst werden, ohne Mehraufwand seitens des Designers. Man fügt die Hitboxen einfach wie beim Actor selbst ein und das System wählt die spezifischste passende Hitbox. Dadurch werden Spiele mit vielen Treffer- oder Angriffszonen wie bspw. Beat'em Ups deutlich einfacher zu implementieren.

Der Wechsel von bewegungsrelevanten Hitboxen ist definitionsmäßig schon etwas verbuggt, da ja plötzlich unerwartet neue Kollisionen auftreten können wo vorher keine waren. Da die bisherige Kollisionserkennung bei Bewegung nur anständig funktioniert wenn sichergestellt ist dass die Hitbox vorher frei von Kollision ist, wird nun vor jeder Bewegung ein "Unstuck" ausgeführt was die Hitbox auf kürzestem Wege aus anderen Hitboxen "drückt". Es ist etwas unschön, jetzt schon Kandidat fürs Refactoring, aber nun funktionieren dafür selbst skurrilste Fälle ordnungsgemäß.

Einheitliches Anfordern von Bildausschnitten

Sowohl das Rendern des Bildes, als auch die Ermittlung von möglicherweise kollidierenden Tiles oder Actors läuft jetzt über eine einheitliche Schnittstelle. Man übergibt lediglich ein Rechteck in Welt-Koordinaten und bekommt eine Liste der Tiles oder Actors die darin liegen oder sich damit schneiden geliefert. Viel alter ineffizienter Code konnte nun gelöscht werden und die Code-Basis ist deutlich besser wartbar. Das hat zusätzlich den Vorteil dass jetzt in typischer WYSIWYG Manier die Hitboxen auch bei übergroßen Tiles bis zu deckungsgleich mit den Pixeln des Tiles sein dürfen. Vorher waren Hitboxen auf die Basiskachelgröße beschränkt. Zudem wird das die Implementation anderer Kachelformen (Isometrisch, Hexagonal) weiter erleichtern.

Passiv fortlaufende Kollisionserkennung

Die Erkennung von nicht bewegungsrelevanten Kollsionen findet nun in einer ziemlich tiefen aber nicht allzu komplexen Funktion statt die pro Hitbox über alle möglichen Kollisionspartner und deren Hitboxen iteriert und auf Kollision prüft. Dank der "einheitlichen Schnittstelle" ist das jetzt endlich kein Problem mehr. 

Durch die vielen Vereinfachungen und der besseren Abstraktion bin ich schon am Nachdenken wann ich wohl von dem AABB("geraden" Hitboxen) Ansatz zu dem OBB("angewinkelte" Hitboxen) wechsle. Jetzt steht dem auf jeden Fall deutlich weniger im Weg.

Neue Benchmark Map

Mir war es schon länger ein Dorn im Auge wie unaufgeräumt die mitgelieferte Beispiel Map ist und dass viele Assets die eigentlich dem "Terra Australis" Projekt zugehörig sind, verpulvert werden. Deswegen wurde die Map jetzt mit einem sehr minimalistischen Ansatz ausgetauscht der außerdem eine sehr kleine Kachelgröße hat (16x16 Pixel) und somit die Zweitfunktion als kleiner Performance Test einnimmt.

Und viele viele Kleinigkeiten

  • Einbindung von fortlaufend spielender Musik möglich
  • Kamera kann via Events vom Spieler entkoppelt und frei bewegt werden
  • Symbolische Tilesets (die Events oder Tastendrücke einlesen) werden in den Mapeigenschaften eingelesen
  • Der Map Einsprungspunkt lautet nun main.tmx
  • Speichermanagement der Map Layers wurde mit Smart-Pointern vereinfacht
  • Entfernung von überflüssigen "Speed" Attributen

Nächste Schritte

Am wichtigsten ist es baldigst ein Event einzufügen, welches je nach Kollisionspartner und/oder der Hitboxen ein anderes angegebenes Event abarbeitet. Damit wird ein Großteil der Spiel Logik gestemmt. Spitze Dinge können weh tun, Power Ups machen ihr Ding. Der ganze Kram eben :-)

Die neue Benchmark Map hat mir gezeigt, dass die Engine selbst bei Edge Cases sehr robust ist. Was mich jedoch stört ist dass die Kollisionserkennung bei hohen Beschleunigungen und sehr kleinen Hitboxen (16x16 Pixel) an ihre Grenzen kommt und unschöne visuelle Bugs hinterlässt. Der komplizierte Ansatz das zu lösen wäre eine Swipe basierte Kollisionserkennung und andere schwarze Magie, jedoch viel leichter wäre es die Update Rate zu erhöhen damit kleinere Bewegungsschritte besser verarbeitet werden können. Das werde ich auch bald in Angriff nehmen.

Weiterhin ganz oben ist das implementieren der verschiedenen Kachelformen. Ich glaube es wäre alleine ein tolles Aushängeschild wenn die Engine genauso mit Rauten und Sechsecken wie mit Rechtecken klar käme.

Ich weiß dass Terra Australis als richtiger Platformer einiges an Zeit und Liebe braucht, darum liebäugele ich derzeit mit dem Schreiben von einem Pong-esquen kleinen Spiel als Nebenprojekt das zeigt: Hey wir sind da und leben!

Ich hoffe die nächsten Tag laufen genau so produktiv ab wie die letzten. Ich auf jeden Fall sehe eine echt strahlende Zukunft mit der RawSalmonEngine!

Kommentare