Szukam informacji o tym, jak ludzie implementują automatyczne zapisywanie w swoich grach opartych na kafelkach. Do tej pory zawsze improwizowałem za pomocą zestawu zakodowanych instrukcji „jeśli ... inaczej ...”, a teraz zdecydowałem, że nadszedł czas, aby znaleźć bardziej eleganckie rozwiązanie. Poszukałem w Internecie przykładów implementacji autotilingu i dyskusji na ten temat, ale wymyśliłem tylko trzy artykuły:
- 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
(Szczególnie ten ostatni jest obszerny i bardzo pomocny.)
Przyjrzałem się także różnym implementacjom i dokumentacji bibliotek, które ją implementują, na przykład flixel: http://www.flixel.org/features.html#tilemaps
Niestety, wszystkie rozwiązania, które mogłem znaleźć, są tak samo improwizowane i przypadkowe, jak to, co zacząłem i prawie nigdy nie obejmują wszystkich możliwych przypadków.
Szukam eleganckiego przykładu implementacji automatycznego zapisywania, z którego mógłbym się uczyć.
Przyszedłem tutaj, googling sam problem, przeczytałem powiązane artykuły i stworzyłem stosunkowo kompaktowe rozwiązanie, które generuje wspólny zestaw 47 płytek. Wymaga zestawu kafelków 2x3 dla autotilowanego materiału, takiego jak ten:
Z wariantem z pojedynczą płytką w lewym górnym rogu, wewnętrznymi narożnikami w prawym górnym rogu i czterema zewnętrznymi płytkami w rogu na dole (możesz rozpoznać ten układ w RPG Maker).
Sztuką jest podzielenie każdego „logicznego” kafelka mapy na 4 półpłytki do renderowania. ponadto półpłytka w zestawie klocków może znajdować się tylko w tej pozycji w wygenerowanym kafelku, więc lewy górny pół-kafelek może być użyty tylko w lewym górnym rogu.
Ograniczenia te oznaczają, że musisz sprawdzić tylko 3 sąsiadów z pełnymi kafelkami na pół kafelka, zamiast wszystkich 8 sąsiadujących kafelków.
Szybko wdrożyłem ten pomysł, aby go przetestować. Oto kod proof-of-concept (TypeScript):
Wyjaśnienie:
A
to górna lewa część kafelka,B
prawy górny róg,C
lewyD
dolny róg, prawy dolny róg.edges
przechowuje maski bitów dla każdego z nich, dzięki czemu możemy pobrać tylko odpowiednie informacje o sąsiadach.map*
to słowniki odwzorowujące stany sąsiednie na wskaźniki graficzne w obrazie zestawu klocków (0..24)._tile
to kafelek przeznaczony do autotilowania.Tak czy inaczej, oto wyniki (w każdym razie tylko z jednym kafelkiem):
źródło
Przeczytałem większość linków i poświęciłem trochę czasu na wymyślenie innego rozwiązania. Nie wiem, czy to dobrze, czy nie, ale aby zasymulować zachowanie automatycznego kafelka RPG Maker VX Ace (47 kafelków), zacząłem robić coś takiego:
Nie jestem programistą i nie jestem najlepszy z algorytmami matematycznymi i rozwiązaniem 1, 2, 4, 8, 16, 32, 64, 128, które też mi się nie podobało.
Może moje podejście jest co najmniej lepsze.
źródło