I „m hinzu Arbeiten an einem 2D-Spiel für WPF8 mit XNA 4.0.

Alles läuft gut, aber es ist zu schnell. Ich habe mich nur gefragt, was ich zwischen dem Ende des Spiels und dem Score-Bildschirm und vor dem Start des Spiels tun kann. Ich suche nach einem Beispiel dafür (schwarzer Bildschirm mit „Laden“ Schreiben im Windows Phone-Stil) oder nach einer Möglichkeit, es zu implementieren.

Kommentare

  • Warum einen Ladebildschirm anzeigen, wenn er völlig unnötig ist? Warum ' machen Sie nicht einfach einen reibungslosen Übergang?
  • Ja, das auch a Lösung, aber ich habe ' keinen Weg gefunden, dies zu tun. Wie eine Bibliothek mit Übergangsanimation.

Antwort

Kein Code von mir, da ich mit XNA nicht so erfahren bin, aber dies ist eher ein allgemeines „Problem“:

  • Zunächst einmal – wie in den Kommentaren erwähnt – keine (niemals!) Falsche Ladebildschirme hinzufügen! Die Leute werden denken, dass es wirklich so ressourcenintensiv ist, dass Ihre App in einem schlechteren Licht angezeigt wird, als es eigentlich sein sollte. Insbesondere auf Mobilgeräten vertrauen Sie normalerweise nicht auf eine App, die beispielsweise Bildschirme mit konstantem Ladevorgang für einen sicheren Akku anzeigt

  • Fügen Sie stattdessen einen Übergang hinzu. Ein sehr einfach durchzuführender Übergang wäre das Mischen zu / von Schwarz. Sie können interessantere Dinge tun, wenn Sie Shader verwenden und Texturen rendern, aber diese sollten mehr als ausreichend sein, um das Tempo etwas zu verlangsamen.

Die grundlegenden Schritte sind ziemlich genau Selbsterklärend und es gibt mehrere Möglichkeiten, dies zu erreichen, auch abhängig davon, wie Sie mit Ihrem Spielstatus, Ihrem Fortschritt usw. umgehen.

  • Anstatt den Spielstatus sofort zu wechseln, z Von GAME_PLAYING bis GAME_HIGHSCORE haben Sie einen Zähler gesetzt. Nennen wir ihn blending_time.
  • Von da an zeichnen Sie, solange blending_time nicht gleich Null ist, einfach ein schwarzes Quad über den gesamten Bildschirm mit einem Alpha-Wert basierend auf der verbleibenden Zeit.
  • Sobald Ihr Zähler Null erreicht hat, betätigen Sie den Status.
  • Um eine weiche Überblendung zu erzielen, können Sie das Ganze umkehren
  • Setzen Sie blending_time erneut auf die Zeit, zu der Sie mischen möchten (möglicherweise möchten Sie einen anderen Wert oder einen anderen Schalter verwenden, um festzustellen, ob eine Mischung mit oder von erfolgt schwarz).
  • Solange blending_time nicht „t 0“ ist, würden Sie je nach Zeit erneut ein schwarzes Quad über die gesamte Szene mit seinem Alpha zeichnen links (diesmal beginnend mit 100% undurchsichtig).

Kommentare

  • Einverstanden, aber auch darüber nachdenken, ob Sie wirklich haben in dieser Zeit nichts zu tun. Einige Spiele veröffentlichen Highscores auf einem Server, andere zeigen Werbung, andere zeigen ausgefallene Animationen. Wenn es sich um ' handelt, bei dem Sie sterben und zum letzten Kontrollpunkt katapultiert werden, benötigt der Spieler lediglich Zeit, um sich mental zurückzusetzen und sich fertig zu machen Eine geeignete Musik / SFX, um sie zu übertreiben, reicht aus.

Antwort

Wenn Sie nach einem Smooth suchen Beim Bildübergang gibt es einen coolen und extrem einfach zu implementierenden Shader, der in Incredipede verwendet wurde. In diesem GDC 2013-Vortrag erklärt das Kunstteam dies ausführlich. Ich habe es auch in Unity implementiert. Wenn Sie den Code sehen möchten, um die Idee zu erhalten und sie in XNA zu übersetzen, gibt es ihn:

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

Der obige Shader ist nur der Übergang. Um einen besseren Effekt zu erzielen, sollten Sie das Bild vorher wie im Vortrag angegeben verwischen. Ich habe den Unschärfeteil der Einfachheit halber weggelassen.

Wenn Sie mehr Details und die vollständige Quelle wünschen, können Sie meine Seite überprüfen .

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.