XNA skata parādīšana tieši WPF logā

Lapa atjaunota :
Lapas izveides datums :

Kopsavilkuma

Aprakstīts, kā atveidot tieši WPF logā ar XNA.

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

Darbības vide

Priekšnoteikumi

Atbalstītās XNA versijas
  • 2.0
  • 3.0
Atbalstītās platformas
  • Windows (XP SP2 vai jaunāka versija, Vista)
Windows nepieciešamā Vertex Shader versija 1.1
Windows nepieciešamā Pixel Shader versija 1.1

Darbības vide

platforma

viela

Izmantojot XNA WPF lietojumprogrammās, es izmantoju WindowsFormsHost vadīklu, lai parādītu skatu, bet tagad es vēlos izmantot tikai WPF logu, lai parādītu daudzstūri. "XNA izmantošana WPF lietojumprogrammās" ir mazliet attēlojums, tāpēc es paskaidrošu atšķirības.

Nosaukumvietas aizstājvārdi

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

Tā kā uz krāsu un matricas struktūrām attiecas XNA Framework un WPF nosaukumvietas, lai to izmantotu, nosaukumvietā ir jānorāda struktūras nosaukums. Tomēr šķiet, ka tas katru reizi ir garš, tāpēc es izveidoju nosaukumvietas aizstājvārdu. Piemēram, "Microsoft.Xna.Framework.Rectangle" tagad var norādīt kā "Xna.Rectangle".

Taimeris

Kopš .NET Framework 3.0 ir pieejama taimera klase ar nosaukumu "System.Windows.Threading.DispatcherTimer", un šī taimera klase tiek izmantota, lai atveidotu katru kadru. WPF izmanto DispatcherTimer, lai varētu apstrādāt tajā pašā pavedienā kā lietotāja interfeiss.

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

lauks, deklarējot DispečeruTaimeri.

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

Definē metodi, ko dispečerstaimeris izsauc regulāri.

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

Tas ir taimera iestatīšanas process. Pēc DispatcherTimer instances izveidošanas un izsaukšanas metodes un laika intervāla iestatīšanas metode DispatcherTimer.Start sāk taimeri.

Loga roktura iegūšana

Lai izveidotu Direct3D ierīci, jums ir nepieciešams loga turis. Tomēr WPF nav loga roktura koncepcijas, tāpēc to nav iespējams iegūt tieši no Window klases.

Tomēr, tā kā ir reizes, kad ir nepieciešams loga rokturis, tāpat kā šajā gadījumā, loga rokturi var iegūt, izmantojot "System.Windows.Interop.WindowInteropHelper" klasi kā Win32 koda interopu. (šī ir Window klase)

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

Izmantojiet šo turi, veidojot Direct3D ierīci. Tomēr, ja jūs mēģināt iegūt loga rokturi OnInitialized metodē, tas atgriezīsies 0, iespējams, tāpēc, ka logs vēl nav izveidots. Šajā paraugā ierīce ir izveidota, izmantojot metodi OnSourceInitialized.

Atveidošana noteiktā apgabalā

Varat norādīt mērķa apgabalu kā otro GraphicsDevice.Present argumentu. Izlasē mēģinu to uzzīmēt pozīcijā (50, 50) kā nobīdi. Izmērs ir tāds pats kā backbuffer izmērs (300, 300). Pirmais arguments ir apgabals, no kura izdarīt atzīmi, un, ja ir norādīts null, tiek izmantots sākotnējais buferis.

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

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

Ierīces iznīcināšana

Aizverot logu, jūs iznīcināt ierīci. Sākotnēji es gribēju to apstrādāt ar Dispose metodi, bet, tā kā WPF Window klase pēc noklusējuma nepārmanto IDisposable, es to uzrakstīju šeit.

/// <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);
}

Izpildes

Ja palaižat parauga programmu, varat to palaist ar ekrāna attēlu, piemēram, raksta sākumā.

No pirmā acu uzmetiena tas labi atveidojas, bet, kad es mainu loga izmērus, velkot to ar peli, skats mirgo vai pazūd izmēru maiņas laikā. Šķiet, ka tas ir pretrunā ar WPF renderēšanu, un es izmēģināju daudzas lietas, bet nevarēju to atrisināt.

Ja izmantojat XNA, šķiet drošāk izmantot WindowsFormsHost vadīklu.

Programmai ir nepieciešams .NET Framework 3.0, jaunākais DirectX izpildlaiks un Microsoft XNA Framework atkārtoti izplatāmais 2.0. Turklāt kā aparatūras prasība ir nepieciešama "grafikas karte, kas atbalsta Pixel Shader 1.1 vai jaunāku versiju".

Turklāt projekts tika izveidots "Visual Studio 2008 Professional Edition". Sagatavojiet vidi Visual Studio 2008.