Sprawia, że cała scena przechodzi w skalę szarości
20
Gdy gracz straci całe swoje życie, chcę, aby cały ekran gry był w odcieniach szarości, ale nie powinien natychmiast przerywać aktualizacji. Wolałbym też, aby zanikał niż w skali szarości, zamiast nagle stracić cały kolor. Wszystko, co do tej pory znalazłem, polega na zrobieniu zrzutu ekranu i zrobieniu go w skali szarości lub stworzeniu określonej tekstury w skali szarości. Czy istnieje sposób na zmianę całego pola gry i wszystkich obiektów w skali szarości bez powtarzania wszystkiego?
Najłatwiej to zrobić, tworząc dla niego moduł cieniujący (patrz kod poniżej). Narysuj wszystko do celu renderowania, a następnie użyj modułu cieniującego, aby narysować to w buforze tylnym
W swoim kodzie gry zapisz, kiedy gracz umiera, a następnie w kolejnych renderach interpoluj parametr modułu cieniującego między 1 (pełny kolor) a 0 (pełna skala szarości) zgodnie z CurrentTime-DeadTime / FadeTime
Jakiś czas temu konwertowałem rgb na szary, ale nie mogłem znaleźć wiarygodnego źródła, więc właśnie użyłem 1.0 / 3,1.0 / 3,1.0 / 3 ... Czy możesz podać źródło stałych liczbowych 0.2,0.59,0.11?
Trevor Boyd Smith
Próbowałem znaleźć skąd mam kod, ale nie byłem w stanie go znaleźć. Oto strona Valve Developer, która używa różnych (ale nieco podobnych) wartości (0,222, 0,707, 0,071).
mogę potwierdzić, że ten moduł cieniujący pracował dla mnie w XNA 4.0
Roboblob
0
EDYTOWAĆ
Po przemyśleniu tego, jeśli nie dodajesz odcienia, ale używając oryginalnych kolorów grafiki, możesz po prostu (jak zaznaczam poniżej) wszystkie kolory rysowanych obiektów ustawić na zadeklarowaną zmienną Color ustawioną na biały. (Color NoTint = Color.White;), a następnie Lerp, że jeśli gracz żyje, jest równy zero. Każdy obiekt narysowany kolorem NoTint będzie powoli zmieniał się (zgodnie ze współczynnikiem interpolacji wymienionym poniżej) na cokolwiek, do czego go wybierasz.
Jeśli jednak masz różne odcienie na różnych obiektach, poniższa pętla foreach może działać.
Zakończ edycję
Przy mojej ograniczonej wiedzy spróbowałbym tego: zadeklaruj kolory używane podczas rysowania określonych obiektów, np. Color catColor = Color.Brown, a następnie dodaj wszystkie kolory gier do listy.
publicstaticColor catColor =Color.Brown;List<Color> colorList =newList<Color>(){ catColor };// and other colorsfloat interpolation =0f;float interpolationRate =.01f;...if(playerLives ==0){
interpolation += interpolationRate;if(interpolation >=1){interpolation =1;}foreach(Color c in colorList){Color.Lerp(c,Color.Gray, interpolation);}}
Możesz to zrobić nawet w przypadku przedmiotów, które rysujesz bez odcienia i Lerp the Color.White to a Color.Gray. (nazwij to jak Kolor NoTint = Color.White i umieść to na wszystkich rysowanych obiektach)
Prawdopodobnie jest lepszy sposób, niezależnie od tego, mam nadzieję, że to pomoże!
-1 Spowoduje to wyblaknięcie całego ekranu do jednego jednolitego koloru, a nie zmianę skali szarości. Skala szarości mierzy kolor według jego jasności (kolor postrzega różne kolory jako mające różne jaskrawości), nie jest to tylko połowa odległości między kolorem a szarością (która wciąż ma kolor).
doppelgreener
Doskonały. Mam nadzieję, że ktoś inny uczy się z tego tak, jak ja. Dzięki!
EDYTOWAĆ
Po przemyśleniu tego, jeśli nie dodajesz odcienia, ale używając oryginalnych kolorów grafiki, możesz po prostu (jak zaznaczam poniżej) wszystkie kolory rysowanych obiektów ustawić na zadeklarowaną zmienną Color ustawioną na biały. (Color NoTint = Color.White;), a następnie Lerp, że jeśli gracz żyje, jest równy zero. Każdy obiekt narysowany kolorem NoTint będzie powoli zmieniał się (zgodnie ze współczynnikiem interpolacji wymienionym poniżej) na cokolwiek, do czego go wybierasz.
Jeśli jednak masz różne odcienie na różnych obiektach, poniższa pętla foreach może działać.
Zakończ edycję
Przy mojej ograniczonej wiedzy spróbowałbym tego: zadeklaruj kolory używane podczas rysowania określonych obiektów, np. Color catColor = Color.Brown, a następnie dodaj wszystkie kolory gier do listy.
Możesz to zrobić nawet w przypadku przedmiotów, które rysujesz bez odcienia i Lerp the Color.White to a Color.Gray. (nazwij to jak Kolor NoTint = Color.White i umieść to na wszystkich rysowanych obiektach)
Prawdopodobnie jest lepszy sposób, niezależnie od tego, mam nadzieję, że to pomoże!
źródło