Friends XNAおよびWPF

最初に、「なぜ彼らを友達にする」という質問に答えます。 答えは簡単です。WPFはユーザーインターフェイスに、XNAは複雑な3Dグラフィックに適しています。複雑なインターフェイスと3D要素を含むクライアントアプリケーションを作成する場合は、XNAとWPFのバンドルが最適です。

この記事を、今書いている単純なメディアプレーヤーの例で説明します。



そのため、XNAで記述されたカバースクローラーがあります。 次のようになります。







また、将来のメディアプレーヤー向けのWPFプロジェクトもあります。そのスクリーンショットを次に示します。







私たちのタスクは、最初のものを2番目のものにすることです。 Windowsフォームのアプリケーションで以前に行ったのと同じことを行います。Gameクラスのクラスのコントロールへのハンドルを、その上に描画するコントロールに転送します。 ただし、小さな問題が1つあります。WPFにはウィンドウのみにハンドルがあります。 ただし、この問題は簡単に解決できます。WindowsFormsHostコントロールをウィンドウに追加し、System.Windows.Forms名前空間からパネルを配置します。 そして、このパネルのハンドルをゲームコンストラクターに転送します。 だから、順番に進んでください:

  1. 1つのソリューションでXNAプロジェクトとWPFプロジェクトを組み合わせる
  2. XNAプロジェクトからProgram.csファイルを削除し、プロジェクトプロパティでWindowsアプリケーションからクラスライブラリにタイプを変更します。
  3. Microsoft.Xna.Framework.GameをWPF参照プロジェクトに追加します
  4. IntPtrハンドルパラメーターをゲームコンストラクター宣言に追加します
  5. WPFフォームコンストラクターで、ゲームクラスのインスタンスを作成し、パネル上でハンドルを渡し、別のスレッドでゲームのRun()メソッドを呼び出します
  6. デバイスの初期化中に、ハンドルを割り当てます


最後の点について説明します。

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 .








まあ、私たちの「ゲーム」はそれに割り当てられたパネルに描かれていますが、この解決策が私に合わないいくつかのポイントがあります:



これらの問題を解決します。 これを行うには、ゲームクラスの使用を停止し、小さなデバイスマネージャーを作成することを提案します。 デバイスを手動で初期化し、タイマーでシーンを再描画し、コントロールのサイズ変更とその破壊に対応する必要があります。 マネージャーにコントロールを転送し、その上で描画、サイズ変更および描画コントロールイベントのサブスクライブ、更新イベントおよび描画イベントのトリガーとなるデバイスとタイマーを作成します。 グラフィカルマネージャーのソースコードは、 ここまたは添付のプロジェクトで確認できます。 パネルに対処するだけです。 適切なスタイルを適用するだけで、パネルの点滅が止まります。 唯一の不便な点は、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