Zastanawiam się nad napisaniem prostej gry 2D. Na początku nie zabłyśnie w doskonałej grafice lub rozgrywce, ale uważam to za pierwszy krok w rozwoju gier komputerowych. Wyobraź sobie więc taką prostą grę 2D opartą na ikonkach (jak Heroes IV lub Startcraft BroodWar).
Chcę, aby rozgrywka wspierała dzień / noc przy odpowiednich zmianach oświetlenia, a jednocześnie szaleństwem będzie tworzenie duszek dla każdego niuansu oświetlenia. Zdecydowałem więc, że dodanie półprzezroczystej warstwy na wierzchu innych obiektów będzie wystarczające.
Problem z tym rozwiązaniem polega na tym, że jeśli w grze mam obiekt będący źródłem światła (np. Bohater noszący pochodnię lub płonący budynek), wokół niego musi znajdować się jaśniejszy obszar, prawda? Skoro nakładam na siebie moją półprzezroczystą warstwę, jak sugerowałbyś osiągnięcie pożądanego efektu wizualnego pochodni? Może przerysuj tę warstwę, dodając „luki” lub obszary o różnych kolorach w zależności od efektu oświetlenia?
Odpowiedzi:
Nie wiem, w czym programujesz, ale tak sobie z tym poradziłem w XNA:
List<Light>
obiekt jest tworzony / usuwany.Light
obiekty są dołączane doList<Light>
.RenderTarget2D
.Light
s jest iterowana i rysowana samodzielnieRenderTarget2D
przy użyciu utworzonej przeze mnie tekstury, która wygląda tak:(Uwaga: Użyłem tutaj wartości R, G i B, ale prawdopodobnie powinieneś użyć kanału alfa w swoim faktyczna tekstura.)
Warto zwrócić uwagę na kilka rzeczy:
W odniesieniu do punktu 4:
Mam dwa niestandardowe moduły cieniujące, jeden do narysowania świateł do celu renderowania oświetlenia (krok 4), a drugi do narysowania celu renderowania kafelków na ekranie za pomocą celu renderowania oświetlenia (krok 5).
Moduł cieniujący użyty w punkcie 4 pozwala mi dodać (jak to nazywam) wartość „luminosity”. Ta wartość jest
float
mnożona przez każdy piksel w teksturze, zanim zostanie dodany do celu renderowania, dzięki czemu mogę zasadniczo rozjaśnić lub przyciemnić światła.W tym momencie biorę również pod uwagę wartość „skali” światła, co oznacza, że mogę mieć duże lub małe światła przy użyciu tylko jednej tekstury.
W odniesieniu do punktu 5:
Pomyśl o celu renderowania oświetlenia, który zasadniczo ma wartość dla każdego piksela od 0 (czarny) do 1 (biały). Moduł cieniujący zasadniczo zwielokrotnia tę wartość w stosunku do wartości RGB piksela w celu renderowania kafelków, aby utworzyć ostatecznie narysowany obraz.
Mam też trochę kodu, w którym przekazuję (do modułu cieniującego) wartość, która ma być użyta jako kolor nakładki dzień / noc. Jest to również mnożone przez wartości RGB i uwzględniane w obliczeniach celu renderowania oświetlenia.
Teraz nie pozwoli ci to robić takich rzeczy jak blokowanie światła przed obiektami i tak dalej, ale przynajmniej dla moich celów jest to proste i działa dobrze.
Pisałem bardziej szczegółowy blogu tutaj i tutaj , które mogą Ci pomóc. Nie mam teraz czasu, ale jeśli chcesz, mogę zagłębić się tutaj w gamedev.
Aha, a oto spojrzenie na to w moim edytorze map:
źródło
Draw
polega na sprawdzeniu, czy kafelek ma światła, czy nie. WUpdate
metodzie nie przeglądam wszystkich narysowanych płytek , więc dodałbym za to dodatkowe koszty. Ponadto XNA stara się zagwarantować, żeUpdate
będzie wywoływany 60 razy na sekundę, więc może poświęcićDraw
wywołania z tego powodu, co oznacza, że ten kod będzie wywoływany rzadziej.Zwykle oświetlenie w grach 2D odbywa się poprzez utworzenie mapy normalnej dla wszystkich duszków, a następnie obliczenie efektów świetlnych 3D na duszkach 2D. Nazywa się to luźno „2.5D”. Nie poleciłbym jednak tego robić w pierwszej grze, ponieważ jest to skomplikowane.
Oto niesamowite wideo osoby, która zrobiła to w XNA: http://www.youtube.com/watch?v=-Q6ISVaM5Ww
To powiedziawszy, są prawdopodobnie sposoby oszukiwania i uzyskania pseudo-oświetlenia, który mógłby działać przy różnych założeniach.
źródło
Trudno zasugerować takie podejście, jeśli nie jesteś całkowicie konkretny co do efektu, który próbujesz osiągnąć. Szczegóły, takie jak to, czy światło powinno być zasłonięte przez środowisko, czy nie, jaki jest punkt twojej gry, w jakim stopniu światło powinno oddziaływać z otoczeniem itp.
Wpuszczę jednak dwa centy. Sprawdź, czy ten samouczek Catalin Zima zatytułowany Dynamiczne cienie 2D pasuje do Twojego rachunku. Jak widać, światło ma promień i nie przechodzi przez przeszkody. Możesz trochę ożywić promień i kolor, aby zbliżyć się do prawdziwego światła pochodni.
W tym przypadku światło działa jak rodzaj nakładki na twoją scenę, ale nie wchodzi w interakcje z nim w takim samym stopniu jak w przykładzie Johna, chociaż bierze pod uwagę przeszkody.
Edytować
Catalin prowadzi do innego artykułu, który wykorzystał jako odniesienie, ale link jest zepsuty. Oto zaktualizowany link .
źródło