I “m werken aan een 2D-game voor WPF8 met XNA 4.0.

Alles gaat geweldig, maar het gaat te snel. Ik vroeg me gewoon af wat ik kon doen tussen het einde van het spel en het scorescherm en voordat het spel begint? Ik ben op zoek naar een voorbeeld van hoe dat te doen (zwart scherm met “laden” schrijven in windows phone-stijl) of een manier om het te implementeren.

Reacties

  • Waarom een laadscherm weergeven als het helemaal niet nodig is? Waarom ' niet gewoon een soepele overgang maken?
  • Ja, dat is ook een oplossing, maar ik heb ' geen manier gevonden om dat te doen. Zoals een bibliotheek met overgangsanimatie.

Antwoord

Geen code van mij, aangezien ik “niet zo ervaren ben met XNA, maar dit is meer een algemeen” probleem “:

  • Allereerst – zoals vermeld in de commentaren – voeg geen (nooit!) Valse laadschermen toe! Mensen zullen denken dat het echt zon zware bron is die je app in een slechter daglicht kan stellen dan hij eigenlijk zou moeten zijn. Vooral op mobiele apparaten vertrouw je meestal niet dat een app die constant laadschermen laat zien om bijvoorbeeld de batterij te sparen.

  • Voeg in plaats daarvan een overgang toe. Een heel gemakkelijk te maken overgang is het mengen van / naar zwart. Je kunt interessantere dingen doen als je shaders gebruikt en render naar texture, maar deze zou meer dan voldoende moeten zijn om het tempo een beetje te vertragen.

De basisstappen zijn min of meer spreekt voor zich en er zijn meerdere manieren om dit te benaderen, ook een beetje afhankelijk van hoe u omgaat met uw spelstatus, voortgang, enz.

  • In plaats van onmiddellijk van spelstatus te wisselen, bijv. van GAME_PLAYING tot GAME_HIGHSCORE, je “had een teller gezet. Laten we het blending_time.
  • Vanaf dat moment, zolang blending_time niet “gelijk is aan nul”, teken je gewoon een zwarte quad over het hele scherm met een alpha-waarde gebaseerd op de resterende tijd.
  • Zodra uw teller nul bereikt, doet u “d de statusschakelaar.
  • Om een zachte menging te krijgen, kunt u het hele ding omdraaien .
  • Stel blending_time opnieuw in op het tijdstip waarop u “wilt mengen (misschien wilt u een andere waarde of een schakelaar gebruiken om aan te geven of er wordt gemengd van of naar zwart).
  • Zolang blending_time niet “t 0 is”, zou je opnieuw een zwarte quad tekenen over de hele scène met zijn alpha afhankelijk van de tijd links (dit keer beginnend met 100% ondoorzichtig).

Reacties

  • Akkoord, maar bedenk ook of je echt hebben in deze tijd niets te doen. Sommige games posten hoge scores op een server, sommige tonen advertenties, sommige tonen mooie animaties. Als het ' het soort spel is waarbij je doodgaat en terug naar het laatste controlepunt wordt gekatapulteerd, heeft de speler alleen tijd nodig om mentaal te resetten en zich klaar te maken, dus een simpele aftelling en een passende muziek / SFX om ze op te vrolijken is voldoende.

Antwoord

Als je op zoek bent naar een vlotte beeldovergang, er is een coole en uiterst eenvoudig te implementeren arcering die werd gebruikt in Incredipede. In deze GDC 2013-lezing legt het kunstteam het in detail uit. Ik heb het ook geïmplementeerd in Unity. Als je de code wilt zien om het idee te krijgen en het naar XNA wilt vertalen, daar is het:

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

De arcering hierboven is slechts de overgang. Om een beter effect te bereiken, moet u het beeld eerder vervagen, zoals vermeld in de lezing. Ik heb het vervagingsgedeelte voor de eenvoud weggelaten.

Als je meer details en de volledige bron wilt, kun je mijn pagina bekijken. .

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *