I “m trabalhando em um jogo 2D para WPF8 usando XNA 4.0.

Tudo vai muito bem, mas é muito rápido. Eu estava pensando, o que eu poderia fazer entre o final do jogo e a tela de pontuação, e antes do jogo começar? Estou procurando um exemplo de como fazer isso (tela preta com “carregamento” escrito no estilo do Windows Phone) ou uma maneira de implementá-lo.

Comentários

  • Por que mostrar uma tela de carregamento quando é totalmente desnecessário? Por que não ' você apenas faz uma transição suave?
  • Sim, isso também solução, mas não ' encontrei uma maneira de fazer isso. Como uma biblioteca com animação de transição.

Resposta

Nenhum código meu, já que “não tenho muita experiência com XNA, mas este é um” problema “mais geral:

  • Em primeiro lugar – conforme mencionado nos comentários – não (nunca, nunca!) Adicione telas de carregamento falsas! As pessoas vão pensar que é realmente aquele recurso pesado que pode mostrar seu aplicativo em uma luz pior do que realmente deveria ser. Especialmente no celular, você não costuma confiar em um aplicativo que mostra telas de carregamento constante para bateria segura, por exemplo.

  • Em vez disso, adicione uma transição. Uma transição muito fácil de fazer seria mesclar de / para preto. Você pode fazer coisas mais interessantes ao usar sombreadores e renderizar para textura, mas este deve ser mais do que suficiente para diminuir um pouco o ritmo.

As etapas básicas são basicamente autoexplicativo e há várias maneiras de abordar isso, também dependendo um pouco de como você lida com o estado do jogo, progresso, etc.

  • Em vez de mudar o estado do jogo imediatamente, por exemplo, de GAME_PLAYING a GAME_HIGHSCORE, você “d definiria algum contador. Vamos chamá-lo de blending_time.
  • A partir daí, contanto que blending_time não seja igual a zero, você apenas desenhará um quadrilátero preto sobre a tela inteira, usando um valor alfa com base no tempo restante.
  • Uma vez que seu contador chega a zero, você muda de estado.
  • Para obter uma mistura suave, você poderia então inverter tudo .
  • Defina novamente blending_time como a hora que você “gostaria de misturar (você pode querer usar um valor diferente ou alguma alternância para identificar se a mistura de ou para preto).
  • Contanto que blending_time não seja “0”, você desenharia mais uma vez um quadrilátero preto em toda a cena com seu alfa dependendo do tempo restante (desta vez começando com 100% opaco).

Comentários

  • Concordo, mas também pense se você realmente não tem nada para fazer neste momento. Alguns jogos postam pontuações altas em um servidor, alguns exibem anúncios, outros exibem animações extravagantes. Se for ' é o tipo de jogo em que você morre e é catapultado de volta para o último ponto de verificação, o tempo é apenas necessário para o jogador redefinir mentalmente e se preparar, então uma simples contagem regressiva alguma música / SFX apropriada para estimulá-los é o suficiente.

Resposta

Se você está procurando por um bom transição de imagem, há um sombreador legal e extremamente fácil de implementar que foi usado no Incredipede. Nesta palestra GDC 2013 , a equipe de arte explica em detalhes. Eu também implementei no Unity. Se você quiser ver o código para ter uma ideia e traduzi-lo para XNA, aqui 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" } 

O sombreador acima é apenas a transição. Para obter um efeito melhor, você deve desfocar a imagem antes, conforme indicado na palestra. Omiti a parte desfocada por uma questão de simplicidade.

Se quiser mais detalhes e a fonte completa, você pode verificar minha página .

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *