Devlog #03 - Neue Kachelformen, Windows Build Testing und vieles Mehr

Der letzte Devlog ist jetzt etwas mehr als 3 Wochen her und die Zahl der Commits ist um ganze 55 gestiegen. Ich bin selbst erstaunt, es hat sich aber auch wirklich viel getan:

Support für alle Kachelformen

Es ist getan, Issue #1 is offiziell closed und jetzt können wir sowohl mit isometrischen (Rauten-förmigen) Kacheln als auch mit Sechsecken in gestaffelter Form arbeiten.

Zu beachten ist, dass neben den zwei verschiedenen Staffelindexen (Map Ursprung "spitz" oder "stumpf") auch beide Staffelachsen unterstützt werden. Für isometrische Maps ist das eher eine Spielerei, aber für Hexagonale Maps bedeutet das, dass auch auf der spitze und auf der Kante stehende Sechsecke unterstützt werden. 

Die Implementation war garnicht so einfach, gerade da die Render-Reihenfolge bei der X-Staffelachse relativ problematisch war. Insgesamt denke ich aber, dass der Code sich schon sehen lassen kann. Die Performance spricht für sich.

Support für alle Render-Reihenfolgen

In den meisten Szenarien nicht allzu relevant, manchmal aber absolut notwendig sind die verschiedenen Render-Reihenfolgen. Relativ primitiv implementiert über das umsortieren von Zeilen und Spalten verrichtet es seinen Dienst ohne zu murren. Sogar mit allen Kachelformen, womit zur Zeit nicht einmal Tiled selbst aufweisen kann.

Support für gespiegelte und rotierte Kacheln

Um ehrlich zu sein habe ich lang vergessen dass Tiled dieses Feature überhaupt aufweist und bei Nutzung früher die Engine seinen Dienst verweigerte. Das ist jetzt anders und sowohl Spiegelung als auch die 90° Rotation wird unterstützt. 
Tiled gibt in den letzten drei Bits der Kachel-ID mit ob Horizontal, Vertikal oder Diagonal gespiegelt werden soll. Ein bisschen kompliziert da SDL2 keine Diagonale Spiegelung unterstützt und ich sie mit Rotation "simulieren" musste. Außerdem ist intern die Standard Größe einer Kachel ID nicht mehr 16bit sondern 32 bit.

Terra Australis PreAlpha 0.0.1

Da mein Fokus die Wochen auf eher für Terra Australis optionale Features war, haben sich so einige Assets unseres wohl geschätzten Game-Artists ungenutzt aufgestaut. Da ich das aber so nicht mit meinem Gewissen vereinbaren konnte, haben wir vor dem "richtigen" Alpha Release noch eine Pre-Alpha gestellt die nun veröffentlich wurde. 

Der Beutelwolf, welcher in der 3D-Grafiksuite Blender gemacht wurde, hat jetzt seinen Walk Cycle, dazu wurden animierte aufsammelbare Muscheln und in Krita handgezeichnetes Terrain gefügt und die Optik kann sich für eine PreAlpha absolut sehen lassen. Ich bin mehr als zufrieden mit dem Fortschritt!

CMake Verbesserungen

Zum einen wurden die Dependencies nun komplett aus dem Projekt ausgelagert. TinyXML2, ZLib, Libb64 und SDL2, -Image, -TTF, -Mixer sucht sich CMake jetzt selber per FindPackage und den dazugehörigen Skripts welche in anderen FOSS Projekten bereitgestellt wurden. Das Builden wird dadurch flexibler und zugleich weniger platform abhängig.

Zum anderen wird der standard Build Type auf Debug gesetzt und es gibt jetzt einen dedizierten Profile Build Type zum testen der Performance, anstatt dass wie früher einfach immer Profiler Infos generiert wurden.

Windows Builds, aka. No more MSVC Hell

Seitdem ich das Feld der Cross-Compilation entdeckt habe, das mir ermöglicht Windows Releases auf einem Linux System zu builden, bin ich endlich am aufatmen. "Microsoft Visual Studio" und sein Compiler sind im mindesten problematisch und kosteten mich viele Nerven. Mingw-w64, die auf der GNU-Compiler-Collection basierende Alternative jedoch macht mir jetzt alles viel leichter.

Die Dependencies in der Windows Variante sind nach wie vor schwer zu beziehen (da Windows nichts im Umfang von Aptitude unter Linux hat) und ich bin nicht drum herum gekommen, selbst alle Dependencies zu kompilieren und in ein separates Repository zu packen welches als Submodul in die Engine eingebunden wird.

TravisCI testet jetzt auch brav win-32 und win-64 builds, als auch ein linux-32 build die alle miteinander kaum Probleme machen. Dank CMake Toolchain Files ist das kompilieren für andere Systeme nicht aufwendiger als -DCMAKE_TOOLCHAIN_FILE="win32-toolchain.cmake" hinzuzufügen und das wars.

Collision Switch Event

Jetzt ist es möglich abhängig vom Namen des Kollisionspartners und den Namen der beiden Hitboxen ein spezifisches Event loszuschicken. Für unsere Collectible funktioniert es schon prima, StreetFighter Klon kann kommen!

Variablen als Event Parameter

Eine der schwierigsten Nüsse welche in den drei Wochen geknackt wurden. Events können jetzt als Parameter Variablen akzeptieren welche an den Actor, die Map oder die Spielinstanz angeheftet wurden. Das macht es möglich die Animationsgeschwindigkeit, an die tatsächliche Geschwindigkeit zu koppeln, Lebensanzeigen abhängig von einer Lebensvariable zu machen, usw.

Updates Zeitabhängig

Die Map stellt jetzt eine Delta-Zeit seit dem letzten Update bereit, mit welcher Events ihren Einfluss in Abhängigkeit der vergangenen Zeit berechnen können. Somit wird ein asymmetrisches Update-Render Verhältnis möglich, was bei zusätzlichen Updates per Frame zu Vorteilen in der Bewegung und Kollisionserkennung von Actors führen kann.

Variable Animationsgeschwindigkeit

Ursprünglich als kleines Gimmick gedacht, hat es dazu geführt dass der Code für die Animation von Kacheln nochmal refactored wurde, jetzt deutlich kleiner, aber auch viel mächtiger ist. Jetzt sind sogar rückwärts laufenden Animationen möglich, die sogar TriggerFrames und Wraps auslösen, was wichtig für die Spiel Logik ist.

Neue Map Speicherformate

Sehr praktisch ist, dass das base64-Format (in welchem unsere Maps bisher gespeichert wurden) nun per zlib komprimiert werden kann, was bei vielen Maps massiv Speicher sparen kann. Die Demo Map hat sich beispielsweise von etwa 2MB auf nicht einmal 100kb verkleinert. Dazu gibt es noch das CSV Format, hauptsächlich damit sich "Neuankömmlinge" nicht erschrecken wenn die Engine beim "standard" Format plötzlich ihren Dienst einstellen würde.

Neues Projekt HiBearNation

Aus dem Gedanken heraus geboren zu zeigen, wie ein Spiel mit Hexagonaler Map in der Engine funktioniert, haben wir das nächste Demo-Game gestartet, "Hi Bear Nation". Darin ist der Spieler ein Bär, der um seinen Winterschlaf halten zu können sich ein ordentliches Fettpolster anfressen muss und dabei der Zivilisation oft näher kommt als ihm lieb ist.

Die ersten Kacheln stehen schon und sehen absolut Phenomenal aus. Auf dem verlinkten Repository wird sich also bald einiges tun.

Ein Haufen Bugfixes und viele Kleinigkeiten

Wie immer kam es auch wieder zu einigen Problemen die mittlerweile alle gelöst wurden:
  • Beispielsweise hat es einige Zeit gebraucht bis mir aufgefallen ist, dass bei der X-Staffelung von Hexagonalen Tiles die Render Reihenfolge garnicht stimmt, was nun gefixt ist.
  • Auch war die Rückwärts-Animation lange Zeit verbuggt und führte zu segfaults. 
  • Der default Build Type hat angegebene Build-Types einfach überschrieben das zur Folge hatte dass immer Debug aktiv war und mich unglücklicherweise lange Zeit davon überzeugte, dass Performance ein ernstzunehmendes Problem bei dem Projekt sei. Seit es den Profile Build Type gibt sehe ich, alles Null Problemo.
  • Zudem hab ich unbedachterweise die Windows Dependencies bevor ich sie in ein separates Repository gesteckt habe in die Engine gepusht und gleich wieder gelöscht und mir ist wieder ein build Ordner in die History gerutscht. Damit diese nutzlosen Artefakte das Repo nicht weiter aufblasen hab ich einen großangelegten History-Rewrite mit dem BFG Repo Cleaner, der Alternative für "git filter-branch", durchgeführt. Das hat die Graphen von Github etwas durchgewühlt, mir meine schönen verified und build passing Badges an fast allen alten Commits gekostet und zudem wurden geschlossene Issues nochmals "mehrfach" geschlossen. Letztlich viel Aufregung um nichts, dafür ist die Größe vom Repo jetzt aber wieder unter 10MB.

Kommentare