Friends XNAおよびWPF
最初に、「なぜ彼らを友達にする」という質問に答えます。 答えは簡単です。WPFはユーザーインターフェイスに、XNAは複雑な3Dグラフィックに適しています。複雑なインターフェイスと3D要素を含むクライアントアプリケーションを作成する場合は、XNAとWPFのバンドルが最適です。
この記事を、今書いている単純なメディアプレーヤーの例で説明します。
そのため、XNAで記述されたカバースクローラーがあります。 次のようになります。
また、将来のメディアプレーヤー向けのWPFプロジェクトもあります。そのスクリーンショットを次に示します。
私たちのタスクは、最初のものを2番目のものにすることです。 Windowsフォームのアプリケーションで以前に行ったのと同じことを行います。Gameクラスのクラスのコントロールへのハンドルを、その上に描画するコントロールに転送します。 ただし、小さな問題が1つあります。WPFにはウィンドウのみにハンドルがあります。 ただし、この問題は簡単に解決できます。WindowsFormsHostコントロールをウィンドウに追加し、System.Windows.Forms名前空間からパネルを配置します。 そして、このパネルのハンドルをゲームコンストラクターに転送します。 だから、順番に進んでください:
- 1つのソリューションでXNAプロジェクトとWPFプロジェクトを組み合わせる
- XNAプロジェクトからProgram.csファイルを削除し、プロジェクトプロパティでWindowsアプリケーションからクラスライブラリにタイプを変更します。
- Microsoft.Xna.Framework.GameをWPF参照プロジェクトに追加します
- IntPtrハンドルパラメーターをゲームコンストラクター宣言に追加します
- WPFフォームコンストラクターで、ゲームクラスのインスタンスを作成し、パネル上でハンドルを渡し、別のスレッドでゲームのRun()メソッドを呼び出します
- デバイスの初期化中に、ハンドルを割り当てます
最後の点について説明します。
IntPtr Handle;
public MainGame( IntPtr handle)
{
Handle = handle;
graphics = new GraphicsDeviceManager( this );
graphics.PreparingDeviceSettings += new EventHandler<PreparingDeviceSettingsEventArgs>(PreparingDeviceSettings);
}
public void PreparingDeviceSettings( object sender, PreparingDeviceSettingsEventArgs e)
{
e.GraphicsDeviceInformation.PresentationParameters.DeviceWindowHandle = Handle;
}
* This source code was highlighted with Source Code Highlighter .
まあ、私たちの「ゲーム」はそれに割り当てられたパネルに描かれていますが、この解決策が私に合わないいくつかのポイントがあります:
- アプリケーションが起動すると、いくつかの左側のウィンドウが並行して作成されます。 もちろん、非表示にすることもできますが、まだよくありません。
- フォームのサイズを変更すると、画像の伸び縮み/圧縮が鈍くなります。 最高の画質を確保するために、デバイスを再初期化したいと思います。
- 私の意見では、最も重要なこと:ゲームとアプリケーションは異なるストリームに住んでいます。 これにより、XNAコードからWPFコントロールを操作しようとするとエラーが発生します。
- パネルは、サイズが変更されると裏切りに点滅します。
これらの問題を解決します。 これを行うには、ゲームクラスの使用を停止し、小さなデバイスマネージャーを作成することを提案します。 デバイスを手動で初期化し、タイマーでシーンを再描画し、コントロールのサイズ変更とその破壊に対応する必要があります。 マネージャーにコントロールを転送し、その上で描画、サイズ変更および描画コントロールイベントのサブスクライブ、更新イベントおよび描画イベントのトリガーとなるデバイスとタイマーを作成します。 グラフィカルマネージャーのソースコードは、
ここまたは添付のプロジェクトで確認できます。 パネルに対処するだけです。 適切なスタイルを適用するだけで、パネルの点滅が止まります。 唯一の不便な点は、SetStyleメソッドのアクセス修飾子が保護されていることです。 まあ、何も、パネルから継承し、コンストラクターで必要なスタイルを適用します。 最適化されたパネルのソースコードは簡単に不名誉になります。
public class OptimizedPanel : Panel
{
public OptimizedPanel()
: base ()
{
this .SetStyle(ControlStyles.UserPaint, true );
this .SetStyle(ControlStyles.Opaque, true );
}
}
* This source code was highlighted with Source Code Highlighter .
これで、すべての準備が整いました。プロジェクトを開始し、すべてが正常に機能することを確認します。パネルが点滅せず、寸法が正しく変更され、アプリケーションが追加のウィンドウを開きません。
ここで 、WPFとXNAを含む初期プロジェクトアプリケーションをダウンロードできます。 さて、ここで私に起こったことがあります:
All Articles