Tworzę grę za pomocą mapy kafelkowej złożonej z wielu tysięcy kwadratowych pól. W tej chwili każdy kwadrat ma kwadratowy zderzak do sprawdzania kolizji.
Jednak w przypadku wielu tysięcy małych bloków sprawdzanie ich pod kątem kolizji jest nieefektywne. Gdybym wiedział, że mapa tilem będzie z góry wyglądać tak, mógłbym po prostu użyć 3 lub 4 dużych zderzaków zamiast tysięcy małych:
Czy istnieje jakiś standardowy algorytm łączenia wielu sąsiadujących płytek w maksymalnie duże? Jeśli tak, czy ktoś mógłby to tutaj opisać lub wskazać literaturę na temat takich algorytmów?
Alternatywnie, być może wstępne przetwarzanie w ten sposób zderzaków płytek jest całkowicie niewłaściwe. Jeśli tak, to jaki jest właściwy sposób radzenia sobie z wydajnością bardzo dużej liczby zderzaczy?
źródło
Odpowiedzi:
Znalazłem użyteczny ten algorytm dla silnika love2d ( język lua )
https://love2d.org/wiki/TileMerging
Oto przykład love2d z mojego obecnego projektu. Na czerwono widać moje zderzaki ścienne.
źródło
Jeśli chcesz stworzyć zniszczalny teren, tak jak ja to zrobiłem w Unity, ustawianie zderzaków tylko na skrajnych blokach twojego świata. Na przykład to, co chciałbyś osiągnąć:
Wszystkie te zielone bloki zawierają zderzak, a reszta nie. To oszczędza mnóstwo obliczeń. Jeśli zniszczysz blok, możesz dość łatwo aktywować zderzaki na sąsiednich blokach. Pamiętaj, że aktywacja / dezaktywacja zderzaka jest kosztowna i powinna być wykonywana oszczędnie.
Zasób kafelków wygląda następująco:
Jest to standardowy obiekt gry, ale można go również pulować. Zauważ również, że moduł zderzający jest domyślnie wyłączony. Aktywowalibyśmy się tylko, jeśli jest to kafelek krawędzi.
Jeśli ładujesz swój świat statycznie, nie ma potrzeby łączenia płytek. Możesz po prostu załadować je wszystkie w jednym ujęciu, obliczyć ich odległość od krawędzi i w razie potrzeby zastosować zderzak.
Jeśli ładujesz się dynamicznie, najlepiej użyć puli kafelków. Oto edytowany przykład mojej pętli odświeżania. Ładuje kafelki na podstawie bieżącego widoku kamery:
Idealnie napisałbym o wiele bardziej szczegółowy post, ponieważ za kulisami dzieje się o wiele więcej. Może ci to jednak pomóc. W razie pytań możesz zapytać lub skontaktować się ze mną.
źródło