I « m travailler sur un jeu 2D pour WPF8 utilisant XNA 4.0.

Tout va bien, mais cest trop rapide. Je me demandais simplement, que pouvais-je faire entre la fin du jeu et lécran des scores, et avant le début du jeu? Je « cherche un exemple de comment faire cela (écran noir avec » chargement « écrit dans le style Windows Phone) ou un moyen de limplémenter.

Commentaires

  • Pourquoi afficher un écran de chargement alors qu’il n’est absolument pas nécessaire? Pourquoi ' n’effectuez-vous pas une transition en douceur?
  • Oui, c’est aussi un solution, mais je nai ' trouvé aucun moyen de le faire. Comme une bibliothèque avec une animation de transition.

Réponse

Aucun code de ma part, puisque je « ne suis pas très expérimenté avec XNA, mais cest plus un » problème « général:

  • Tout dabord – comme mentionné dans les commentaires – najoutez pas (jamais jamais!) De faux écrans de chargement! Les gens penseront que cest vraiment cette ressource lourde qui peut montrer votre application sous un jour pire quelle ne devrait lêtre. Surtout sur mobile, vous ne faites généralement pas confiance à une application affichant des écrans de chargement constants pour protéger la batterie par exemple.

  • À la place, ajoutez une transition. Une transition très facile à faire serait de mélanger vers / depuis le noir. Vous pouvez faire des choses plus intéressantes lors de lutilisation des shaders et du rendu en texture, mais celui-ci devrait être plus que suffisant pour ralentir un peu le rythme.

Les étapes de base sont à peu près explicite et il existe plusieurs façons daborder cela, en fonction également un peu de la façon dont vous gérez votre état de jeu, votre progression, etc.

  • Plutôt que de changer détat de jeu immédiatement, par exemple de GAME_PLAYING à GAME_HIGHSCORE, vous « d définissez un compteur. Appelons-le blending_time.
  • A partir de là, tant que blending_time nest pas égal à zéro, vous « allez simplement dessiner un quad noir sur tout lécran, en utilisant un valeur alpha basée sur le temps restant.
  • Une fois que votre compteur atteint zéro, vous changez détat.
  • Pour obtenir un mélange progressif, vous pouvez alors inverser le tout .
  • Réglez à nouveau blending_time lheure à laquelle vous souhaitez « mélanger » (vous voudrez peut-être utiliser une valeur différente ou une bascule pour identifier si la fusion vers ou depuis noir).
  • Tant que blending_time nest pas « t 0, vous » dessineriez à nouveau un quadrilatère noir sur toute la scène avec son alpha en fonction du temps gauche (cette fois en commençant par 100% opaque).

Commentaires

  • Daccord, mais demandez-vous également si vous vraiment nont rien à faire pendant cette période. Certains jeux affichent des scores élevés sur un serveur, certains affichent de la publicité, dautres affichent des animations fantaisistes. Si ' est le genre de jeu où vous mourez et êtes catapulté au dernier point de contrôle, le joueur a simplement besoin de temps pour se réinitialiser mentalement et se préparer, donc un simple compte à rebours et de la musique / SFX appropriée pour les hype suffit.

Réponse

Si vous recherchez un transition dimage, il existe un shader cool et extrêmement facile à mettre en œuvre qui a été utilisé dans Incredipede. Dans cette conférence GDC 2013 , léquipe artistique lexplique en détail. Je lai également implémenté dans Unity. Si vous voulez voir le code pour avoir lidée et le traduire en XNA, le voici:

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

Le shader ci-dessus nest que la transition. Pour obtenir un meilleur effet, vous devez brouiller limage avant comme indiqué dans la conférence. Jai omis la partie flou par souci de simplicité.

Si vous voulez plus de détails et la source complète, vous pouvez vérifier ma page .

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *