XNA görünümünü doğrudan WPF penceresinde görüntüleme

Sayfa güncel :
Sayfa oluşturma tarihi :

özet

XNA ile doğrudan bir WPF penceresinde nasıl işleneceğini açıklar.

WPF ウインドウ上に直接 XNA のビューを表示する

Çalışma ortamı

Önkoşullar

Desteklenen XNA Sürümleri
  • 2.0
  • 3.0
Desteklenen Platformlar
  • Windows (XP SP2 veya üstü, Vista)
Windows Gerekli Köşe Gölgelendiricisi Sürümü 1.1
Windows Gerekli Pixel Shader Sürümü 1.1

Çalışma ortamı

peron

madde

WPF Uygulamalarında XNA Kullanma'da, görünümü görüntülemek için WindowsFormsHost denetimini kullandım, ancak şimdi çokgeni görüntülemek için yalnızca WPF penceresini kullanmak istiyorum. "WPF Uygulamalarında XNA Kullanma" biraz temsildir, bu yüzden farkları açıklayacağım.

Ad alanı diğer adları

// 名前空間エイリアス
using Xna = Microsoft.Xna.Framework;
using XnaGraphics = Microsoft.Xna.Framework.Graphics;

Renk ve Matris yapıları XNA Çerçevesi ve WPF ad alanları tarafından kapsandığından, yapının adını kullanmak için ad alanından belirtmeniz gerekir. Ancak, her seferinde uzun görünüyor, bu yüzden bir ad alanı takma adı oluşturuyorum. Örneğin, "Microsoft.Xna.Framework.Rectangle" artık "Xna.Rectangle" olarak belirtilebilir.

Zamanlayıcı

.NET Framework 3.0'dan bu yana, "System.Windows.Threading.DispatcherTimer" adlı bir zamanlayıcı sınıfı mevcuttur ve bu zamanlayıcı sınıfı her kareyi işlemek için kullanılır. WPF, kullanıcı arabirimiyle aynı iş parçacığı üzerinde işlemeye izin vermek için bir DispatcherTimer kullanır.

/// <summary>
/// タイマー
/// </summary>
private DispatcherTimer timer = null;

alanı, bir DispatcherTimer bildiriyor.

/// <summary>
/// タイマーイベント
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void dispatcherTimer_Tick(object sender, EventArgs e)
{
    this.Draw();
}

DispatcherTimer'ın düzenli aralıklarla çağırdığı bir yöntem tanımlar.

// タイマー
this.timer = new DispatcherTimer();
this.timer.Tick += new EventHandler(dispatcherTimer_Tick);
this.timer.Interval = new TimeSpan(0, 0, 0, 0, 16);
this.timer.Start();

Bu, zamanlayıcıyı ayarlama işlemidir. DispatcherTimer'ın bir örneğini oluşturduktan ve yöntemi çağıracak şekilde ve zaman aralığını ayarladıktan sonra, DispatcherTimer.Start yöntemi zamanlayıcıyı başlatır.

Bir pencere kolu edinme

Bir Direct3D aygıtı oluşturmak için bir pencere tanıtıcısına ihtiyacınız vardır. Ancak, WPF bir pencere tanıtıcısı kavramına sahip değildir, bu nedenle bunu doğrudan Window sınıfından almanın bir yolu yoktur.

Ancak, bu durumda olduğu gibi bir pencere tutamacının gerekli olduğu zamanlar olduğundan, pencere tanıtıcısı Win32 kodu için bir birlikte çalışma olarak "System.Windows.Interop.WindowInteropHelper" sınıfı aracılığıyla elde edilebilir. (bu Window sınıfıdır)

// ウィンドウハンドルを取得する
IntPtr handle = new WindowInteropHelper(this).Handle;

Direct3D aygıtı oluştururken bu tanıtıcıyı kullanın. Ancak, OnInitialized yönteminde pencere tanıtıcısını almaya çalışırsanız, büyük olasılıkla pencere henüz oluşturulmadığı için 0 döndürür. Bu örnekte, cihaz OnSourceInitialized yönteminde oluşturulur.

Belirtilen Alana Render

Hedef alanı, GraphicsDevice.Present öğesinin ikinci bağımsız değişkeni olarak belirtebilirsiniz. Örnekte ofset olarak (50, 50) pozisyonunda çizmeye çalışıyorum. Boyut, arka arabelleğin boyutuyla aynıdır (300, 300). İlk bağımsız değişken, çizilecek alandır ve null belirtilirse, orijinal arabellek kullanılır.

// 描画先を指定する
Xna.Rectangle rect = new Xna.Rectangle(
    50, 50,
    (int)this.viewSize.Width, (int)this.viewSize.Height);

this.device.Present(null, rect, this.windowHandle);

Bir cihazı yok etme

Pencereyi kapattığınızda cihazınızı yok ediyorsunuz. Başlangıçta Dispose metodu ile halletmek istemiştim fakat WPF Window sınıfı varsayılan olarak IDisposable'ı kalıtım almadığı için onun yerine buraya yazdım.

/// <summary>
/// ウインドウが閉じたとき
/// </summary>
/// <param name="e"></param>
protected override void OnClosed(EventArgs e)
{
    if (this.device != null)
    {
        this.device.Dispose();
        this.device = null;
    }

    base.OnClosed(e);
}

idam

Örnek programı çalıştırdığınız takdirde yazının başındaki gibi bir ekran görüntüsü ile çalıştırabilirsiniz.

İlk bakışta iyi bir şekilde görüntüleniyor, ancak pencereyi fareyle sürükleyerek yeniden boyutlandırdığımda, yeniden boyutlandırma sırasında görünüm titriyor veya kayboluyor. WPF oluşturma ile çakışıyor gibi görünüyor ve birçok şey denedim ama çözemedim.

XNA kullanıyorsanız, WindowsFormsHost denetimini kullanmak daha güvenli görünüyor.

Program, .NET Framework 3.0, en son DirectX çalışma zamanı ve Microsoft XNA Framework Yeniden Dağıtılabilir 2.0 gerektirir. Ek olarak, bir donanım gereksinimi olarak, "Pixel Shader 1.1 veya üstünü destekleyen bir grafik kartı" gereklidir.

Ayrıca, proje "Visual Studio 2008 Professional Edition" da oluşturulmuştur. Visual Studio 2008 için bir ortam hazırlayın.