I “m 2D-s játék fejlesztése a WPF8 számára az XNA 4.0 használatával.

Minden remekül megy, de túl gyorsan. Csak arra gondoltam, mit tehetnék a játék vége és az eredményképernyő között, és mielőtt a játék elkezdődne? Keresek egy példát, hogyan lehet ezt megtenni (fekete képernyő, a “betöltés” írás Windows Phone stílusban) vagy annak megvalósítási módja.

Megjegyzések

  • Miért kell egy betöltő képernyőt megjeleníteni, ha az teljesen felesleges? Miért ne ' tennénk csak egy átmenetet?
  • Igen, ez is megoldást, de nem találtam erre módot '. Mint egy átmeneti animációjú könyvtár.

Válasz

Nincs kód tőlem, mivel nem vagyok az XNA-val tapasztalt, de ez inkább általános “probléma”:

  • Először is – amint az a megjegyzésekben is szerepel – ne (soha soha!) Ne adjon hozzá hamis betöltő képernyőket! Az emberek azt gondolják, hogy ez valóban olyan nehéz erőforrás, amely rosszabb megvilágításban tudja megmutatni az alkalmazást, mint aminek valójában lennie kellene. Különösen a mobileszközökön nem szokott megbízni egy olyan alkalmazásban, amely állandóan betöltő képernyőket jelenít meg például a biztonságos akkumulátor számára.

  • Ehelyett adjon átmenetet. Nagyon könnyen elvégezhető átmenet lenne a feketére való átkeverés. Érdekesebb dolgokat tehet, amikor az árnyékolókat és a renderelést textúrára használja, de ennek többnek kell lennie, mint egy kicsit lassítani a tempót.

Az alapvető lépések nagyjából magától értetődő, és ennek többféle módja van, ez kissé attól is függ, hogy hogyan kezeled a játék állapotát, az előrehaladást stb.

  • Ahelyett, hogy azonnal megváltoztatnád a játék állapotát, pl. GAME_PLAYING -től GAME_HIGHSCORE -ig beállítasz egy számlálót. Hívjuk blending_time.
  • Innentől kezdve, amíg blending_time nem egyenlő a nullával, csak egy fekete négyzetet rajzol az egész képernyőre, egy alfaérték a hátralévő idő alapján.
  • Amint a számláló eléri a nullát, megteszi az állapotkapcsolót.
  • A lágy keveredés érdekében megfordíthatja az egészet .
  • Ismét állítsa az blending_time beállítást arra az időre, amelyet keverni szeretne (érdemes más értéket használni, vagy valamilyen kapcsolót annak azonosításához, hogy keveredik-e vagy sem. fekete).
  • Amíg blending_time nem “t 0”, akkor az idő függvényében ismét egy fekete quadot rajzolunk az egész jelenetre az alfájával balra (ezúttal 100% -ban átlátszatlanul kezdődik).

Megjegyzések

  • Egyetértettek, de gondolkodjanak el azon is, hogy valóban nek semmi köze nincs ez idő alatt. Néhány játék magas pontszámokat tesz közzé egy szerveren, van, amelyik reklámot mutat, van, aki fantasztikus animációkat mutat. Ha ' az a fajta játék, ahol meghalsz és katapultálódsz az utolsó ellenőrző ponthoz, időre van szükség csupán ahhoz, hogy a játékos mentálisan visszaálljon és felkészülhessen, tehát egy egyszerű visszaszámlálás és elegendő néhány megfelelő zene / SFX.

Válasz

Ha zökkenőmentesre vágysz képátmenet, van egy hűvös és rendkívül egyszerűen megvalósítható árnyékoló, amelyet az Incredipede-ben használtak. Ebben a GDC 2013 beszélgetésben a művészeti csapat részletesen elmagyarázza. A Unity-ben is megvalósítottam. Ha meg akarja tekinteni a kódot, hogy megszerezze az ötletet és lefordítsa XNA-ba, ott van:

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

A fenti árnyékoló csak átmenet. A jobb hatás elérése érdekében el kell homályosítania a képet, mielőtt a beszélgetésben elmondták. Az egyszerűség kedvéért kihagytam az elmosódott részt.

Ha további részleteket és teljes forrást szeretne, ellenőrizheti az oldalamat .

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük