I “m lavorando su un gioco 2D per WPF8 usando XNA 4.0.
Tutto va alla grande, ma è troppo veloce. Mi stavo solo chiedendo, cosa potevo fare tra la fine del gioco e la schermata del punteggio e prima che il gioco inizi? Sto cercando un esempio di come farlo (schermo nero con “caricamento” della scrittura in stile Windows Phone) o un modo per implementarlo.
Commenti
- Perché mostrare una schermata di caricamento quando è completamente inutile? Perché non ' fai solo una transizione graduale?
- Sì, anche quella soluzione, ma ' non ho trovato alcun modo per farlo. Come una libreria con animazione di transizione.
Risposta
Nessun codice da me, dal momento che “non ho esperienza con XNA, ma questo è un” problema “più generale:
-
Prima di tutto – come menzionato nei commenti – non (mai e poi mai!) Aggiungi finte schermate di caricamento! La gente penserà che sia davvero quella risorsa pesante che può mostrare la tua app in una luce peggiore di quanto dovrebbe essere in realtà. Soprattutto sui dispositivi mobili di solito non ti fidi di unapp che mostra schermate di caricamento costanti per proteggere la batteria, ad esempio.
-
Aggiungi invece una transizione. Una transizione molto facile da eseguire sarebbe la fusione al / dal nero. Puoi fare cose più interessanti quando usi gli shader e il rendering in base alla trama, ma questo dovrebbe essere più che sufficiente per rallentare un po il ritmo.
I passaggi di base sono praticamente autoesplicativo e ci sono molti modi per affrontarlo, anche a seconda di come gestisci lo stato del gioco, i progressi, ecc.
- Invece di cambiare lo stato del gioco immediatamente, ad es. da
GAME_PLAYING
aGAME_HIGHSCORE
, avresti “impostato un contatore. Chiamiamoloblending_time
. - Da quel momento in poi, finché
blending_time
non è uguale a zero, disegnerai semplicemente un quadrilatero nero su tutto lo schermo, utilizzando un valore alfa basato sul tempo rimanente. - Una volta che il contatore raggiunge lo zero, fai “d linterruttore di stato.
- Per ottenere una fusione morbida, puoi quindi invertire lintera cosa .
- Imposta di nuovo
blending_time
sul tempo in cui desideri eseguire la fusione (potresti utilizzare un valore diverso o un interruttore per identificare se la fusione da o verso nero). - Finché
blending_time
non è “t 0,” disegneresti ancora una volta un quadrilatero nero sullintera scena con il suo alfa a seconda del tempo rimanenti (questa volta iniziando con il 100% opaco).
Commenti
- Daccordo, ma pensa anche se davvero non hanno niente da fare in questo periodo. Alcuni giochi pubblicano punteggi più alti su un server, alcuni mostrano pubblicità, altri mostrano animazioni fantasiose. Se ' è il tipo di gioco in cui si muore e si viene catapultati allultimo checkpoint, il giocatore ha semplicemente bisogno di tempo per resettarsi mentalmente e prepararsi, quindi un semplice conto alla rovescia e un po di musica / effetti sonori appropriati per pubblicizzarli è sufficiente.
Risposta
Se stai cercando un transizione dellimmagine, cè uno shader interessante ed estremamente facile da implementare che è stato utilizzato in Incredipede. In questo conferenza sulla GDC 2013 , il team artistico lo spiega in dettaglio. Lho anche implementato in Unity. Se vuoi vedere il codice per avere lidea e tradurlo in XNA, eccolo:
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" }
Lo shader sopra è solo la transizione. Per ottenere un effetto migliore dovresti sfocare limmagine prima come affermato nel discorso. Ho omesso la parte sfocata per motivi di semplicità.
Se desideri maggiori dettagli e la fonte completa, puoi controllare la mia pagina .