Jak ustalić kolejność losowania w grze flash w widoku izometrycznym?

12

To jest gra flash z widokiem izometrycznym. Muszę wiedzieć, jak sortować obiekty, aby nie było potrzeby sprawdzania bufora Z podczas rysowania. To może wydawać się łatwe, ale istnieje inne ograniczenie, scena może zawierać ponad 10 000 obiektów, więc algorytm musi być uruchomiony w mniej niż O (n ^ 2). Wszystkie obiekty są prostokątnymi polami, a na scenie poruszają się 3-4 obiekty. Jak najlepiej to zrobić?

AKTUALIZACJA

w każdym kafelku jest tylko obiekt (mam na myśli, że obiekty nie mogą się ustawiać jeden na drugim). a my mamy dostęp do mapy obiektów, a obiekty mają swoją pozycję.

AKTUALIZACJA 2

zobacz te liczby:

wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj

w pierwszym należy narysować pierwszy niebieski obiekt, a następnie zielony, a następnie czerwony. podczas gdy w drugim musisz je narysować w odwrotnej kolejności. najpierw musisz narysować czerwony, a następnie zielony, a na końcu niebieski obiekt. jak widać, nie ma różnicy w położeniu niebieskich i czerwonych obiektów, oba mają różną odległość od aparatu i tak dalej. ale ze względu na ich względne położenie względem zielonego pola, musisz zmienić ich kolejność rysowania między dwoma obrazkami. to sprawia, że ​​ten problem jest bałaganem.

uwaga dodatkowa: ponieważ wszystkie obiekty są prostokątnymi pryzmatami, matematycznie można udowodnić, że istnieje co najmniej jedna kolejność rysowania w celu zaspokojenia potrzeb problemowych.

Ali1S232
źródło
2
Powinieneś opublikować więcej informacji. Czy obiekty mogą się układać w stosy (3d)? Obiekty mają pozycje czy mapa ma obiekty? itd.
kaoD
2
Jest to taka sama jak gamedev.stackexchange.com/questions/8151/...
Tetrad
@Tetrad tak, ale jest niewielka różnica w obiektach, które umieszczamy na scenie.
Ali1S232
@Gajet (po aktualizacji) obiektami mogą być tylko 1 * X i X * 1, a także X * Y? Czy stać Cię na podzielenie obiektów na kilka podobiektów? (np. zielony to 4 sub-zielone obiekty) Czy orientacja obiektu jest stała?
kaoD
Ponadto: ile sąsiednich kafelków przesłania wysokość twojego obiektu?
kaoD

Odpowiedzi:

8

Jest to w rzeczywistości bardzo proste, jeśli twoje obiekty pasują do twoich płytek izometrycznych. Spójrz na ten obraz:

Izometryczny porządek rysowania

Powinieneś najpierw narysować obiekt w pozycji czerwonej, następnie obiekty w kolorze niebieskim, następnie zielonym, następnie żółtym, następnie purpurowym i tak dalej ... Powinno być całkiem oczywiste, jak to zaimplementować, jeśli na planszy są obiekty zamiast obiektów mając pozycję jako atrybut. Jeśli tak nie jest, powinieneś zachować oddzielną strukturę danych, aktualizując ją za każdym razem, gdy obiekt się porusza (co również powinno być dość łatwe).

Ma to nowy problem: możesz łatwo zobaczyć, jak teraz jego złożoność wynosi O (N), gdzie N jest rozmiarem twojej płyty ( N=W*H). Aby rozwiązać ten problem, po prostu utwórz nową liniową strukturę danych, w której każdy indeks w strukturze pasuje do określonej głębokości, aktualizując ją za każdym razem, gdy obiekt zmienia głębokość.

Przypadek, w którym obiekt nie pasuje do jednego kafelka, jest nieco trudniejszy, więc opublikuję go, jeśli będzie potrzebny, jak tylko zaktualizujesz swoje pytanie.

kaoD
źródło
ten algorytm jest również pierwszym, który przyszedł mi do głowy, ale zobacz moją aktualizację, dlatego nie możesz jej używać bez zmian.
Ali1S232
1
@Gajet i właśnie tego rodzaju pytania należy udzielić w pytaniu: P
kaoD
3
W ten sposób należy podzielić duże części na „kafelki” +1
Valmond
2

Nie mam specjalnej wiedzy na ten temat, ale oto myśl.

Zacznij od oznaczenia każdej komórki jako „nie narysowanej”. (Lub, równoważnie, użyj tablicy do reprezentowania położenia najbliższej „narysowanej” rzeczy na każdej „bliskiej linii” komórek lub zestawu itp.) Następnie dla każdej komórki (prawdopodobnie przejrzałbym je w kolejność opisana kaoD): sprawdź, czy ta komórka została narysowana; jeśli nie został narysowany i zawiera obiekt, sprawdź, czy każda komórka, która byłaby zasłonięta przez ten obiekt, została narysowana, a jeśli nie, narysuj go rekurencyjnie; w razie potrzeby narysuj obiekt zawarty w tej komórce; i zaznacz tę komórkę i wszystkie komórki zajmowane przez jej obiekt jako „narysowane”.

Zakładam, że możesz szybko odwzorować komórkę na znajdujący się w niej obiekt, jeśli taki istnieje. Wydaje mi się, że jest to czas O (n), ale może skończyć się budowaniem dużego stosu (który możesz chcieć zmienić w połączoną listę, jeśli martwisz się brakiem miejsca na stosie).

Jeśli naprawdę potrzebujesz listy, możesz dołączyć do listy zamiast rysować. Podejrzewam, że rozpoczęcie od najczęściej posortowanej listy nie pomaga.

Vincent Povirk
źródło
Uważam, że ten algorytm może być postrzegany jako forma topologii dostosowanej do problemu; Miałem właśnie wskazać niejasno w tym kierunku. Sortowanie topologiczne jest rozwiązaniem większości problemów związanych z porządkowaniem / zależnością.
Kevin Reid
1

Chciałbym skorzystać z algorytm malarza z odległości taksówki od najdalszej celi z dala od aparatu, rysunek te najbliżej aparatu, a następnie przeniesienie na zewnątrz.

Edycja: To nie działa, chyba że możesz narysować zawartość każdej komórki osobno.

Quasiperfect
źródło
to może działać, ale nie potrafię odróżnić od algorytmów zaproponowanych przez bajt56 lub kaoD. wydaje mi się, że nadal występują takie same problemy, jak opisane w mojej drugiej edycji.
Ali1S232
1

Co sprawia, że ​​uważasz, że „matematycznie można udowodnić, że istnieje co najmniej jedno polecenie losowania w celu zaspokojenia potrzeb problemowych”? Oto prosty przykład, w którym nie można polegać na obiektach sortujących Z:

wprowadź opis zdjęcia tutaj

sam hocevar
źródło
Z ciekawości ... czy mógłbyś rozwinąć kontrprzykład? To nie jest siatka.
kaoD
pamiętaj, że na każdym kafelku jest tylko jeden obiekt i obiekt może zajmować jedną lub więcej kafelków, ale zawsze mają prostokątny rzut na płaszczyznę. te dwa warunki są wystarczające do udowodnienia tego stwierdzenia.
Ali1S232
Ok, z tymi ograniczeniami i faktem, że siatka jest płaska, istnieje rozwiązanie. Wyślę to później.
sam hocevar