I «m trabajando en un juego 2D para WPF8 usando XNA 4.0.

Todo va muy bien, pero es demasiado rápido. Me preguntaba qué podría hacer entre el final del juego y la pantalla de puntuación, y antes de que comience el juego. Estoy buscando una muestra de cómo hacer eso (pantalla negra con escritura «cargando» en el estilo de Windows Phone) o una forma de implementarlo.

Comentarios

  • ¿Por qué mostrar una pantalla de carga cuando es completamente innecesario? ¿Por qué no ' simplemente realiza una transición suave?
  • Sí, eso también solución, pero no ' no encontré ninguna forma de hacerlo. Como una biblioteca con animación de transición.

Respuesta

No hay código de mi parte, ya que «no tengo mucha experiencia con XNA, pero este es un» problema «más general:

  • En primer lugar, como se menciona en los comentarios, no (¡nunca jamás!) Agregue pantallas de carga falsas. La gente pensará que es realmente un recurso pesado que puede mostrar su aplicación en una luz peor de lo que realmente debería ser. Especialmente en dispositivos móviles, por lo general, no confía en una aplicación que muestra pantallas de carga constante para una batería segura, por ejemplo.

  • En su lugar, agregue una transición. Una transición muy fácil de hacer sería mezclar hacia / desde negro. Puedes hacer cosas más interesantes al usar sombreadores y renderizar a textura, pero esto debería ser más que suficiente para ralentizar un poco el ritmo.

Los pasos básicos son prácticamente se explica por sí mismo y hay varias formas de abordar esto, también dependiendo un poco de cómo manejes el estado del juego, el progreso, etc.

  • En lugar de cambiar el estado del juego inmediatamente, por ejemplo de GAME_PLAYING a GAME_HIGHSCORE, «establecerías algún contador. Vamos a llamarlo blending_time.
  • De ahí en adelante, siempre que blending_time no sea igual a cero, simplemente dibujará un cuadrante negro sobre toda la pantalla, usando un valor alfa basado en el tiempo restante.
  • Una vez que su contador llega a cero, hace «d el cambio de estado.
  • Para obtener una mezcla suave, puede revertir todo .
  • Vuelva a establecer blending_time en el momento en que le gustaría mezclar (es posible que desee usar un valor diferente o algún alternador para identificar si se combina hacia o desde negro).
  • Siempre que blending_time no sea «t 0,» dibujarías una vez más un cuadrante negro sobre toda la escena con su alfa dependiendo del tiempo izquierda (esta vez comenzando con 100% opaco).

Comentarios

  • De acuerdo, pero también piense si realmente no tengo nada que hacer en este momento. Algunos juegos publican puntuaciones altas en un servidor, algunos muestran publicidad, algunos muestran animaciones elegantes. Si ' es el tipo de juego en el que mueres y te catapultan de regreso al último punto de control, el jugador simplemente necesita tiempo para restablecerse mentalmente y prepararse, así que una simple cuenta atrás y un poco de música / SFX apropiado para exaltarlos es suficiente.

Respuesta

Si está buscando una transición de imagen, hay un sombreador genial y extremadamente fácil de implementar que se usó en Incredipede. En esta charla de GDC 2013 , el equipo de arte lo explica en detalle. También lo he implementado en Unity. Si desea ver el código para obtener la idea y traducirlo a XNA, ahí está:

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

El sombreador de arriba es solo la transición. Para lograr un mejor efecto, debe desenfocar la imagen antes como se indica en la charla. He omitido la parte borrosa por simplicidad.

Si desea más detalles y la fuente completa, puede consultar mi página .

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *