I „m práce na 2D hře pro WPF8 pomocí XNA 4.0.
Všechno jde skvěle, ale je to příliš rychlé. Jen jsem přemýšlel, co bych mohl dělat mezi koncem hry a výsledkovou obrazovkou a před začátkem hry? Hledám ukázku toho, jak to udělat (černá obrazovka s „načítáním“ ve stylu Windows Phone), nebo způsob, jak to implementovat.
Komentáře
- Proč se zobrazuje načítací obrazovka, když je zcela zbytečná? Proč ' prostě neprovádíte plynulý přechod?
- Ano, také řešení, ale nenašel jsem ' žádný způsob, jak to udělat. Jako knihovna s animací přechodu.
Odpovědět
Žádný kód ode mě, protože s XNA nejsem tak zkušený, ale toto je spíše obecný „problém“:
-
Nejprve – jak je uvedeno v komentářích – nepřidávejte (nikdy!) Falešné obrazovky načítání! Lidé si budou myslet, že je to opravdu tak těžké zdroje, které dokážou vaši aplikaci zobrazit v horším světle, než by ve skutečnosti mělo být. Zejména v mobilních zařízeních obvykle nedůvěřujete aplikaci, která zobrazuje konstantní načítání obrazovky, například kvůli bezpečné baterii.
-
Místo toho přidejte přechod. Velmi snadným přechodem by bylo míchání do / z černé. Když použijete shadery a vykreslení na texturu, můžete udělat zajímavější věci, ale tohle by mělo být více než dostatečné, aby trochu zpomalilo tempo.
Základní kroky jsou do značné míry vysvětlující a existuje několik způsobů, jak k tomu přistupovat, a to také trochu v závislosti na tom, jak zacházíte se stavem hry, pokrokem atd.
- Spíše než okamžité přepínání stavu hry, např. od
GAME_PLAYING
doGAME_HIGHSCORE
nastavíte nějaké počítadlo. Pojďme to nazvatblending_time
. - Od té doby, dokud
blending_time
není rovno nule, jednoduše nakreslíte černý quad přes celou obrazovku pomocí alfa hodnota na základě zbývajícího času. - Jakmile váš čítač dosáhne nuly, provedete přepnutí stavu.
- Chcete-li získat jemné prolínání, můžete celou věc obrátit .
- Znovu nastavte
blending_time
na čas, který chcete smíchat (možná budete chtít použít jinou hodnotu nebo nějaký přepínač k určení, zda se smíchat do nebo z černá). - Dokud
blending_time
není „0“, nakreslíš znovu černou čtyřkolku po celé scéně s její alfa v závislosti na čase vlevo (tentokrát od 100% neprůhledných).
Komentáře
- Souhlasím, ale také přemýšlejte o tom, zda opravdu tentokrát nemám co dělat. Některé hry zveřejňují vysoké skóre na serveru, jiné ukazují reklamu, jiné zobrazují fantastické animace. Pokud je to ' druh hry, kde zemřete a katapultujete se zpět na poslední kontrolní bod, stačí čas, aby se hráč mentálně resetoval a připravil, takže jednoduché odpočítávání a stačí nějaká vhodná hudba / SFX, která je nadchne.
Odpověď
Pokud hledáte hladký přechod obrazu, existuje skvělý a extrémně snadno implementovatelný shader, který byl použit v Incredipede. V této přednášce GDC 2013 to umělecký tým podrobně vysvětlí. Také jsem to implementoval v Unity. Pokud chcete vidět kód, abyste získali nápad a přeložili ho do XNA, je zde:
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" }
Výše uvedený shader je pouze přechod. Abyste dosáhli lepšího efektu, měli byste nejprve rozmazat obraz, jak je uvedeno v přednášce. Kvůli jednoduchosti jsem část rozmazání vynechal.
Pokud chcete více podrobností a úplný zdroj, můžete zkontrolovat moji stránku .