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ą.
Odpowiedzi:
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:
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:
Kod bajtu dla tego kafelka to 10001000 lub 136. Jako kolejny przykład przyjrzyjmy się trójstronnemu skrzyżowaniu:
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.
źródło
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.
źródło