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 do GAME_HIGHSCORE, ustawiłeś jakiś licznik. Nazwijmy to blending_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ę .

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *