I “m arbejder på et 2D-spil til WPF8 ved hjælp af XNA 4.0.

Alt går godt, men det er for hurtigt. Jeg spekulerede bare på, hvad kunne jeg gøre mellem slutningen af spillet og score-skærmen, og inden spillet starter? Jeg leder efter et eksempel på, hvordan man gør det (sort skærm med “indlæsning” skriver i Windows-telefonstil) eller en måde at implementere det på.

Kommentarer

  • Hvorfor vise en indlæsningsskærm, når den er fuldstændig unødvendig? Hvorfor gør du ikke ' t foretager du bare en jævn overgang?
  • Ja, det er også en løsning, men jeg fandt ' ikke nogen måde at gøre det på. Ligesom et bibliotek med overgangsanimation.

Svar

Ingen kode fra mig, da jeg ikke er så erfaren med XNA, men dette er mere et generelt “problem”:

  • Først og fremmest – som nævnt i kommentarerne – tilføj ikke (aldrig nogensinde!) Falske indlæsningsskærme! Folk tror, at det virkelig er en ressource tung, som kan vise din app i et dårligere lys, end den faktisk skulle være. Især på mobil stoler du normalt ikke på en app, der f.eks. Viser konstant indlæsningsskærme til sikkert batteri.

  • I stedet skal du tilføje en overgang. En meget let at gøre overgang ville være at blande til / fra sort. Du kan gøre mere interessante ting, når du bruger shaders og gengiver til tekstur, men denne skal være mere end tilstrækkelig til at bremse tempoet lidt.

De grundlæggende trin er stort set meget selvforklarende, og der er flere måder at nærme sig dette på, også afhængigt af, hvordan du håndterer din spiltilstand, fremskridt osv.

  • I stedet for at skifte spiltilstand med det samme, f.eks. fra GAME_PLAYING til GAME_HIGHSCORE, du ville indstille en tæller. Lad os kalde det blending_time.
  • Derfra, så længe blending_time ikke er lig med nul, tegner du bare en sort firkant over hele skærmen ved hjælp af en alfa-værdi baseret på den resterende tid.
  • Når din tæller når nul, skal du skifte tilstand.
  • For at få en blød blanding ind, kan du derefter vende det hele .
  • Indstil igen blending_time til det tidspunkt, du gerne vil blande (du vil muligvis bruge en anden værdi eller en eller anden skifte til at identificere, om der blandes til eller fra sort).
  • Så længe blending_time ikke er “t 0, skulle du endnu en gang tegne en sort firkant over hele scenen med dens alfa afhængigt af tiden tilbage (denne gang startende med 100% uigennemsigtig).

Kommentarer

  • Enig, men tænk også på, om du virkelig har intet at gøre i denne tid. Nogle spil sender high scores til en server, andre viser reklame, andre viser fancy animationer. Hvis det ' er den slags spil, hvor du dør og bliver katapulteret tilbage til det sidste kontrolpunkt, er det kun nødvendigt med tid til, at spilleren mentalt nulstilles og gør sig klar, så en simpel nedtælling og noget passende musik / SFX til at hype dem op er nok.

Svar

Hvis du leder efter en glat billedovergang, er der en kølig og ekstremt let at implementere skyggefuld, der blev brugt i Incredipede. I denne GDC 2013-tale forklarer kunstteamet det detaljeret. Jeg har også implementeret det i Unity. Hvis du vil se koden for at få ideen og oversætte den til XNA, er den der:

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

Shader ovenfor er bare overgangen. For at opnå en bedre effekt skal du sløre billedet før som angivet i foredraget. Jeg har udeladt sløringsdelen for enkelheds skyld.

Hvis du vil have flere detaljer og den fulde kilde, kan du tjekke min side .

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *