I „m lucrând la un joc 2D pentru WPF8 folosind XNA 4.0.

Totul merge excelent, dar este prea rapid. Mă întrebam, ce aș putea face între sfârșitul jocului și ecranul de scor și înainte ca jocul să înceapă? Caut un eșantion despre cum să fac asta (ecran negru cu „încărcare” de scriere în stil Windows Phone) sau o modalitate de a o implementa.

Comentarii

  • De ce să afișați un ecran de încărcare atunci când este complet inutil? De ce nu ' pur și simplu faceți o tranziție lină?
  • Da, asta este și o soluție, dar nu am găsit ' nicio modalitate de a face acest lucru. Ca o bibliotecă cu animație de tranziție.

Răspuns

Niciun cod de la mine, deoarece „nu am experiența cu XNA, dar aceasta este mai degrabă o” problemă „generală:

  • În primul rând – așa cum se menționează în comentarii – nu (niciodată niciodată!) Nu adăugați ecrane de încărcare false! Oamenii vor crede că este cu adevărat o sursă de resurse care poate afișa aplicația dvs. într-o lumină mai slabă decât ar trebui să fie de fapt. Mai ales pe dispozitive mobile, nu aveți încredere într-o aplicație care afișează ecrane de încărcare constantă pe baterie sigură, de exemplu.

  • În schimb, adăugați o tranziție. O tranziție foarte ușoară ar fi amestecarea la / de la negru. Puteți face lucruri mai interesante atunci când utilizați umbrele și redați textura, dar acesta ar trebui să fie mai mult decât suficient pentru a încetini puțin ritmul.

Pașii de bază sunt destul de mult se explică de la sine și există mai multe modalități de a aborda acest lucru, în funcție de un pic de modul în care gestionați starea jocului, progresul etc.

  • În loc să schimbați imediat starea jocului, de ex. de la GAME_PLAYING la GAME_HIGHSCORE, ați seta un numărător. Să-l numim blending_time.
  • De acolo înainte, atâta timp cât blending_time nu este egal cu zero, veți desena doar un quad negru pe întregul ecran, folosind un valoare alfa bazată pe timpul rămas.
  • Odată ce contorul atinge zero, faceți „comutatorul de stare.
  • Pentru a obține o amestecare ușoară, puteți inversa întregul lucru .
  • Setați din nou blending_time la momentul în care „doriți să amestecați (este posibil să doriți să utilizați o altă valoare sau să comutați pentru a identifica dacă se amestecă la sau de la negru).
  • Atâta timp cât blending_time nu este „t 0, ați desena încă o dată un quad negru pe întreaga scenă cu alfa în funcție de timp rămase (de data aceasta începând cu 100% opac).

Comentarii

  • De acord, dar gândiți-vă și dacă într-adevăr nu am nimic de făcut în acest timp. Unele jocuri postează scoruri mari pe un server, altele arată publicitate, altele prezintă animații fanteziste. Dacă ' este genul de joc în care mori și te catapultezi înapoi la ultimul punct de control, timpul este doar necesar pentru ca jucătorul să se reseteze mental și să se pregătească, deci o simplă numărătoare inversă și este suficientă o anumită muzică / SFX adecvată pentru a le exagera.

Răspuns

Dacă sunteți în căutarea unei melodii fluide tranziția imaginii, există un shader răcoros și extrem de ușor de implementat care a fost folosit în Incredipede. În această discuție GDC 2013 , echipa de artă o explică în detaliu. L-am implementat și în Unity. Dacă doriți să vedeți codul pentru a obține ideea și a-l traduce în XNA, acesta este:

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" } 

Shaderul de mai sus este doar tranziția. Pentru a obține un efect mai bun, ar trebui să estompați imaginea înainte, așa cum sa menționat în discuție. Am omis partea de estompare din motive de simplitate.

Dacă doriți mai multe detalii și sursa completă, puteți verifica pagina mea .

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *