Ich suche nach Informationen darüber, wie Leute Autotiling in ihren kachelbasierten Spielen implementieren. Bisher habe ich es immer mit einer Reihe von hartcodierten "if ... else ..." - Aussagen improvisiert, und jetzt habe ich beschlossen, dass es Zeit ist, eine elegantere Lösung zu finden. Ich habe im Internet nach Beispielen für Autotiling-Implementierungen und Diskussionen zu diesem Thema gesucht, aber nur drei Artikel gefunden:
- http://www.codeproject.com/Articles/106884/Implementing-Auto-tiling-Functionality-in-a-Tile-M
- http://blog.rpgmakerweb.com/tutorials/anatomy-of-an-autotile
- http://web.archive.org/web/20130927193449/http://www.squidi.net/mapmaker/musings/m091016.php
(Besonders der letzte ist umfassend und sehr hilfreich.)
Ich habe mir auch verschiedene Implementierungen und Dokumentationen von Bibliotheken angesehen, die diese implementieren, zum Beispiel flixel: http://www.flixel.org/features.html#tilemaps
Leider sind alle Lösungen, die ich finden konnte, genauso improvisiert und willkürlich wie das, womit ich angefangen habe, und decken fast nie alle möglichen Fälle ab.
Ich suche nach einem eleganten Beispiel für die Implementierung von Autotiling, von dem ich lernen kann.
Ich bin hierher gekommen, indem ich dieses Problem selbst gegoogelt, die verlinkten Artikel gelesen und eine relativ kompakte Lösung erstellt habe, die den gemeinsamen Satz von 47 Kacheln generiert. Für das automatisch gekachelte Material ist ein 2x3-Kachelsatz erforderlich:
Mit einer Einzelkachelvariante oben links, inneren Ecken oben rechts und vier äußeren Eckkacheln unten (Sie können diese Anordnung von RPG Maker erkennen).
Der Trick besteht darin, jede "logische" Kartenkachel zum Rendern in 4 Halbkacheln zu unterteilen. Darüber hinaus kann sich eine halbe Kachel im Kachelsatz nur in dieser Position in einer generierten Kachel befinden, sodass eine obere linke halbe Kachel nur in einer Position oben links verwendet werden kann.
Diese Einschränkungen bedeuten, dass Sie nur 3 Vollkachelnachbarn pro Halbkachel anstelle aller 8 benachbarten Kacheln überprüfen müssen.
Ich habe diese Idee schnell umgesetzt, um sie zu testen. Hier ist der Proof-of-Concept-Code (TypeScript):
Erläuterung:
A
ist der obere linke Teil der Kachel,B
ist der obere rechte Teil,C
ist der untere linke Teil,D
ist der untere rechte Teil.edges
enthält Bitmasken für jede dieser Informationen, sodass wir nur die relevanten Nachbarinformationen abrufen können.map*
sind Wörterbücher, die Nachbarzustände grafischen Indizes im Kachelsatzbild (0..24) zuordnen._tile
ist die Kachel, die für das Autotiling bestimmt ist.Wie auch immer, hier sind die Ergebnisse (jedenfalls mit nur einer Kachel):
quelle
Ich habe die meisten Links gelesen und einige Zeit damit verbracht, eine andere Lösung zu finden. Ich weiß nicht, ob es gut ist oder nicht, aber um das automatische Kachelverhalten von RPG Maker VX Ace (47 Kacheln) zu simulieren, habe ich Folgendes begonnen:
Ich bin kein Programmierer und nicht der Beste mit mathematischen Algorithmen und der 1, 2, 4, 8, 16, 32, 64, 128-Lösung, die mir auch nicht besonders gut gefallen hat.
Vielleicht ist mein Ansatz zumindest besser.
quelle