Jak mogę zaimplementować światła i cienie w wielowarstwowej mapie 2D?

11

Jestem w trakcie pisania od podstaw gry izometrycznej i chciałbym wiedzieć, jak / czy mogę dodać światła i cienie.

Kod, który do tej pory mam, można znaleźć tutaj , ale powinno być wystarczające, aby wiedzieć, że w tej chwili mapy to proste trójwymiarowe tablice wartości prawda / fałsz . Oto ujęcie środowiska:Zrzut ekranu wielowarstwowej mapy warstwowej

Gdyby to była jednowarstwowa mapa tilem, byłaby prosta. Rozumiem prosty wymagany raycasting w 2d.

Jednak biorąc pod uwagę, że moje mapy mają wiele poziomów wysokości, a także obszary przypominające jaskinie, tak naprawdę nie wiem, jak zrobić przekonujące cienie. Być może rozwiązanie na blok jest jedynym realistycznym sposobem?

Danie Clawson
źródło
Szukasz wstępnie upieczonego lub generowanego dynamicznie oświetlenia? Czy „obszary przypominające jaskinie” są pokazane jako wycięte, jeśli gracz wejdzie, czy też światło musi uwzględniać sufit? Czy spodziewasz się, że każda płytka będzie binarnie oświetlona / ciemna, czy będzie miała jakąś wartość ułamkową?
Anko
1
@ Anko Wolałbym coś ułamkowego, na przykład 0 - 1,1 (w przypadku zbyt jasnych obszarów, takich jak eksplozje itp.), Ale może to być po prostu blok, bez prawdziwej interpolacji lub czegoś podobnego. Naprawdę chcę, aby był dynamiczny i obsługiwał wiele świateł. I podczas gdy „jaskiniowe” / zadaszone obszary zostaną pokazane w odcięciu, algo musiałby wziąć pod uwagę bloki, których nie pokazano podczas obliczania światła. Na przykład, jeśli wejdziesz do domu, bloki dachowe znikną, ale nadal powinno być zacienione w środku.
Danie Clawson,
Jeśli szukasz takiego rozwiązania z jaskiniami i wysokością, wygląda na to, że nie masz nic w 2D. Prawdopodobnie szukasz pełnego rozwiązania 3D, nawet jeśli kamera zawsze patrzy w kierunku północnym-45º w dół. Powinieneś spojrzeć na techniki takie jak szablon-cień lub podobne.
Adrian Maire,
Po drugie @AdrianMaire musisz wykonać odpowiednie obliczenia 3d, ale zrobić kilka skrótów, jeśli nie ma interpolacji na powierzchniach „kafelka”. Jeśli nie wykonujesz interpolacji, prawdopodobnie możesz użyć promieni.
NeomerArcana
W tej chwili nie mam przestrzeni myślowej, aby przetłumaczyć to na odpowiedź, ale natknąłem się na ten wpis na blogu o określeniu linii wzroku dla terenu mapy wysokości . Brzmi dokładnie tak, jak tego szukasz.
Anko,

Odpowiedzi:

1

Czy mogę polecić uruchomienie cieni 2d, nawet jeśli jest to tylko poziom, na którym aktualnie znajduje się twój awatar. Łatwiej będzie zacząć patrzeć na kod w ten sposób i uruchomić go.

Zaimplementowałem cienie w mapach kafelkowych 2D na kilka sposobów. Jedna metoda rzucania cienia opisana przez Erica Lipperta w Microsoft działa całkiem dobrze.

Innym sposobem, który zrobiłem sam po raz pierwszy, gdy spojrzałem na tego rodzaju rzeczy, było ortogonalnie zamiatanie widocznych płytek i krawędzi płytek i generowanie krawędzi (i może iirc rundy) opisujących scenę w najniższej liczbie krawędzi. Następnie możesz wyciąć ukryte krawędzie i utworzyć dowolne niestandardowe funkcje cieniowania, takie jak wpuszczone cienie, jeśli chcesz pokazać odrobinę ściany. Następnie utwórz swoją geometrię cienia (rzutowe rzucanie cienia?) I wyrenderuj ją nad górą.

Ale jeśli spróbuję przenieść ten pomysł na 3d, łatwiej będzie to zrobić w 3d. Chociaż metodę opisaną przez Erica Lipperta można przypuszczalnie przekonwertować na 3d. Ale myślę, że przekonasz się, że robienie tego w 3D jest drogie. Być może spójrz również na kod źródłowy Brogue . Może mieć bardziej wydajną implementację widoczności / rzucania cieni.

Powodzenia.

Gavin Williams
źródło