I „m praca nad grą 2D dla WPF8 przy użyciu XNA 4.0.
Wszystko idzie świetnie, ale jest za szybko. Zastanawiałem się tylko, co mogę zrobić między zakończeniem gry a ekranem wyników, a przed rozpoczęciem gry? Szukam próbki, jak to zrobić (czarny ekran z napisem „ładowanie” w stylu telefonu z systemem Windows) lub sposobu na zaimplementowanie tego.
Komentarze
- Po co wyświetlać ekran wczytywania, gdy jest on zupełnie niepotrzebny? Dlaczego nie ' t po prostu dokonujesz płynnego przejścia?
- Tak, to też rozwiązania, ale nie ' nie znalazłem żadnego sposobu, aby to zrobić. Na przykład biblioteka z animacją przejścia.
Odpowiedź
Brak kodu ode mnie, ponieważ nie mam takiego doświadczenia z XNA, ale jest to bardziej ogólny „problem”:
-
Po pierwsze – jak wspomniano w komentarzach – nie (nigdy!) Nie dodawaj fałszywych ekranów ładowania! Ludzie pomyślą, że to naprawdę duże zasoby, które mogą pokazać twoją aplikację w gorszym świetle niż w rzeczywistości. Zwłaszcza na urządzeniach mobilnych zwykle nie ufasz aplikacji wyświetlającej ciągłe ekrany ładowania, na przykład bezpieczną baterię.
-
Zamiast tego dodaj przejście. Bardzo łatwym do zrobienia przejściem byłoby zmieszanie z / do czerni. Możesz robić ciekawsze rzeczy, używając shaderów i renderowania tekstur, ale ten powinien być więcej niż wystarczający, aby nieco zwolnić tempo.
Podstawowe kroki są prawie nie wymaga wyjaśnień i można do tego podejść na wiele sposobów, również zależnych nieco od tego, jak radzisz sobie ze stanem gry, postępem itp.
- Zamiast natychmiast przełączać stan gry, np. od
GAME_PLAYING
doGAME_HIGHSCORE
, ustawiłeś jakiś licznik. Nazwijmy toblending_time
. - Od tego momentu, dopóki
blending_time
nie jest równe zeru, wystarczy narysować czarną czwórkę na całym ekranie, używając wartość alfa na podstawie pozostałego czasu. - Gdy licznik osiągnie zero, zmieniasz stan.
- Aby uzyskać miękkie wtopienie, możesz następnie odwrócić całość .
- Ponownie ustaw
blending_time
na czas, w którym chcesz mieszać (możesz użyć innej wartości lub przełącznika, aby określić, czy mieszanie jest czarny). - Dopóki
blending_time
nie jest „t 0”, „d” narysuj ponownie czarną czwórkę na całej scenie z jej alfa zależną od czasu lewo (tym razem zaczynając od 100% nieprzezroczystości).
Komentarze
- Zgoda, ale zastanów się też, czy naprawdę nie mają nic do roboty w tym czasie. Niektóre gry publikują najlepsze wyniki na serwerze, niektóre wyświetlają reklamy, inne wyświetlają fantazyjne animacje. Jeśli ' jest grą, w której umierasz i zostajesz katapultowany z powrotem do ostatniego punktu kontrolnego, wystarczy czasu, aby gracz zresetował się mentalnie i przygotował, więc proste odliczanie i wystarczy trochę odpowiedniej muzyki / SFX, aby je podekscytować.
Odpowiedz
Jeśli szukasz gładkiej przejścia obrazu, istnieje fajny i niezwykle łatwy do zaimplementowania moduł cieniujący, który został użyty w Incredipede. W tym wykładzie GDC 2013 zespół grafików szczegółowo to wyjaśnia. Zaimplementowałem to również w Unity. Jeśli chcesz zobaczyć kod, aby uzyskać pomysł i przetłumaczyć go na XNA, oto on:
Shader "Custom/InkPress" { Properties { _MainTex ("Base (RGB)", 2D) = "white" {} _BlurTex ("Base (RGB)", 2D) = "white" {} } SubShader { Pass { //Usual post processing setup ZTest Always Cull Off ZWrite Off Fog { Mode off } CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma target 2.0 #include "UnityCG.cginc" struct v2f { float4 pos : POSITION; float2 uv : TEXCOORD0; }; v2f vert (appdata_img v) { v2f o; o.pos = mul(UNITY_MATRIX_MVP, v.vertex); o.uv = v.texcoord.xy; return o; } sampler2D _MainTex; sampler2D _BlurTex; float _threshold; float4 frag( v2f v ) : COLOR { // Step 1: Get the brightness of the blur texture float2 vUv = v.uv; float4 returnColour = float4(1.0 , 1.0 , 1.0 , 1.0); float3 texColour = tex2D(_BlurTex , v.uv).xyz; float bright = (texColour.r + texColour.g + texColour.b) / 3.0; //Step 2: Return the main texture pixel colour if its brightness is bellow //the threshold. Clear the pixel otherwise. if(bright < _threshold) { returnColour = tex2D(_MainTex , v.uv); } return returnColour; } ENDCG } } FallBack "Diffuse" }
Powyższy moduł cieniujący to tylko przejście. Aby uzyskać lepszy efekt, należy wcześniej rozmazać obraz, jak stwierdzono w przemówieniu. Ze względu na prostotę pominąłem część dotyczącą rozmycia.
Jeśli potrzebujesz więcej szczegółów i pełnego źródła, możesz sprawdzić moją stronę .