Wybierz kafelek na podstawie sąsiadujących kafelków


10

Pracuję nad edytorem map kafelkowych i muszę automatycznie wybierać kafelki na podstawie sąsiadujących kafelków. Na przykład, umieszczając kafelek drogi obok innego kafelka drogi, oba muszą być ustawione tak, aby tworzyły ciągłą drogę. Jeśli wokół nich znajdują się inne drogi, może być konieczne użycie kafelków narożników lub skrzyżowań.

Czy ktoś może polecić jakieś algorytmy? Gra wykorzystuje 8-kierunkową kwadratową mapę kafelkową.


Czy nie możesz po prostu zbadać wszystkich 8 sąsiadujących płytek, gdy użytkownik odłoży nowy kafelek i odpowiednio zorientować nowy kafelek? Oczywiście musisz przechowywać dodatkowe informacje na każdym kafelku, takie jak orientacja i typ.
XiaoChuan Yu

Badam wszystkie sąsiadujące kafelki, ale nie wiedziałem, jak poradzić sobie ze wszystkimi kombinacjami kafelków. Na przykład masz do wyboru siedem możliwych kafelków (poziomy, pionowy, cztery rogi i krzyż). Myślałem o użyciu skomplikowanych instrukcji przełączania, ale to wydawało się złe.
alekop

Odpowiedzi:


18

Może tak zazwyczaj się to robi. Masz listę różnych kafelków, które reprezentują kafelki drogowe we wszystkich możliwych orientacjach. Od lewej do prawej, wszystkie cztery rogi, od góry do dołu, cokolwiek. Teraz zindeksujesz wszystkie kafelki bajtami. 8 bitów, po jednym dla każdego kierunku. Może to być mapa skrótowa lub nazwa pliku ... jednak chcesz to zrobić.

Więc masz to:

wprowadź opis zdjęcia tutaj

Kod bajtu dla powyższego kafelka to 00000000 . W takim razie kafelek biegnący od lewej do prawej (lub od prawej do lewej) wygląda następująco:

wprowadź opis zdjęcia tutaj

Kod bajtu dla tego kafelka to 10001000 lub 136. Jako kolejny przykład przyjrzyjmy się trójstronnemu skrzyżowaniu:

wprowadź opis zdjęcia tutaj

Kod bajtu dla tego kafelka to 10101000 .

Prawdopodobnie widzisz, dokąd idę. Pozycje bitów ustawia się w bajcie reprezentującym połączenia. Jest to o wiele lepsze niż próba wykonania dużego łańcucha if / else, który widziałem wcześniej. Kiedy chcesz umieścić kafelek, sprawdź płytki wokół niego i utwórz bajt po drodze. Ustaw 1 dla kafelków, które mają drogi (lub cokolwiek, co chcesz połączyć) i 0 dla kafelków, które nie mają. Kiedy skończysz, będziesz mieć bajtowy kod dokładnie tego, czego potrzebujesz.

Zauważ, że podczas tworzenia zasobów możesz ponownie wykorzystać wiele z nich, po prostu obracając i przypisując do niego poprawny kod bajtowy.

EDYCJA : Zaktualizowano obrazy, aby były mniej gburowate. Tak, są lepsze niż wcześniej.


Bardzo dobrze! Prosty i wydajny. Jedyne, czego nie rozumiem, to sposób, w jaki otrzymujesz te maski bitowe. Na przykład, w jaki sposób otrzymujesz maskę bitową 17 z liczb 3 i 7?
alekop

Nieważne, widzę, co robisz. Ustawiasz bity 3 i 7, ale liczysz od lewej zamiast od prawej.
alekop

Och, wow, jakie żenujące. Zmieszałem moją Endianness . To był wypadek, który naprawię!
MichaelHouse

Świetnie, teraz mój komentarz nie ma sensu! : p Żartowałem, dziękuję za odpowiedź. Właśnie tego szukałem.
alekop

1
Dobre wytłumaczenie. Mam wpis na blogu dotyczący tej samej techniki z rzeczywistym kodem i rozdzielczością kafli: kitsu.github.io/2016/07/07/18/roguelike-project-05
kitsu.eb

3

Polecam zajrzeć na tę poręczną stronę, aby uzyskać więcej informacji, ponieważ zawiera ona bardzo szczegółowe informacje na temat prawie każdego aspektu tego, co robisz, a także kilka potencjalnych optymalizacji: http://www.angryfishstudios.com / 2011/04 / adventures-in-bitmasking /

Tldr polega na wysłaniu zapytania do każdej sąsiedniej komórki i zapisaniu kombinacji w polu bitowym / bajcie, a następnie przekazaniu jej przez mapę, która konwertuje liczbę z 0 ~ 255 na wartość z 0 ~ 47, co odpowiada unikalnemu obrazowi.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.