I “m XNA4.0を使用してWPF8用の2Dゲームに取り組んでいます。
すべてがうまくいきますが、速すぎます。ゲームの終了からスコア画面まで、そしてゲームが始まる前に何ができるのだろうかと思っていました。私はそれを行う方法のサンプル(Windows Phoneスタイルで「ロード」書き込みを伴う黒い画面)またはそれを実装する方法を探しています。
コメント
- 完全に不要なのにロード画面を表示するのはなぜですか?'スムーズに移行しないのはなぜですか?
- ええ、それも解決策ですが、'それを行う方法が見つかりませんでした。トランジションアニメーションを備えたライブラリのように。
回答
私はXNAの経験があまりないので、コードはありませんが、これはより一般的な「問題」です:
-
まず第一に-コメントに記載されているように-偽のロード画面を追加しないでください(決して!)人々は、実際にはリソースが重いため、アプリが実際よりも悪い光で表示される可能性があると考えるでしょう。特にモバイルでは、通常、安全なバッテリーに一定のロード画面を表示するアプリを信頼していません。
-
代わりに、トランジションを追加します。非常に簡単に移行できるのは、黒との間でブレンドすることです。シェーダーを使用してテクスチャにレンダリングすると、もっと面白いことができますが、ペースを少し遅くするには、これで十分です。
基本的な手順はほとんどです。自明であり、これにアプローチする方法は複数あります。ゲームの状態や進行状況などの処理方法にも少し依存します。
- ゲームの状態をすぐに切り替えるのではなく、たとえば
GAME_PLAYING
からGAME_HIGHSCORE
まで、カウンターを設定します。これをblending_time
。 - それ以降、
blending_time
がゼロに等しくない限り、画面全体に黒いクワッドを描画します。残り時間に基づくアルファ値。 - カウンターがゼロに達したら、状態を切り替えます。
- ソフトブレンディングを取得するには、すべてを逆にすることができます。 。
- もう一度
blending_time
をブレンドしたい時間に設定します(ブレンドするかどうかを識別するために、別の値またはトグルを使用することをお勧めします)黒)。 -
blending_time
が0でない限り、時間に応じてアルファを使用してシーン全体に黒いクワッドをもう一度描画します。左(今回は100%不透明から開始)。
コメント
- 同意しましたが、本当にかどうかも考えてください。 今回は何の関係もありません。サーバーにハイスコアを投稿するゲームもあれば、広告を表示するゲームもあれば、派手なアニメーションを表示するゲームもあります。 'が死んで最後のチェックポイントに戻るようなゲームの場合、プレーヤーが精神的にリセットして準備を整えるのに時間が必要なだけなので、簡単なカウントダウンとそれらを誇大宣伝するための適切な音楽/ SFXがあれば十分です。
回答
スムーズなものを探している場合画像遷移には、Incredipedeで使用されていたクールで非常に簡単に実装できるシェーダーがあります。この GDC 2013トークでは、アートチームが詳細に説明しています。 Unityにも実装しました。アイデアを得てXNAに変換するためのコードを確認したい場合は、次のようになります。
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" }
上記のシェーダーは単なる遷移です。より良い効果を達成するには、トークで述べたように、前に画像をぼかす必要があります。わかりやすくするために、ぼかしの部分は省略しました。
詳細と完全なソースが必要な場合は、マイページを確認してください。 。