XNA-vaate kuvamine otse WPF-aknas

Lehekülg uuendatud :
Lehe loomise kuupäev :

Kokkuvõte

Kirjeldab, kuidas XNA-ga otse WPF-aknas renderdada.

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

Töökeskkond

Eeltingimused

Toetatud XNA versioonid
  • 2.0
  • 3.0
Toetatud platvormid
  • Windows (XP SP2 või uuem, Vista)
Windowsi nõutav vertex shaderi versioon 1.1
Windowsi nõutav versioon Pixel Shader 1.1

Töökeskkond

platvorm

aine

XNA kasutamisel WPF-i rakendustes kasutasin vaate kuvamiseks WindowsFormsHosti juhtelementi, kuid nüüd tahan hulknurga kuvamiseks kasutada ainult WPF-akent. "XNA kasutamine WPF-rakendustes" on natuke esindus, seega selgitan erinevusi.

Nimeruumi pseudonüümid

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

Kuna värvi- ja maatriksstruktuurid on kaetud XNA Frameworki ja WPF-i nimeruumidega, peate selle kasutamiseks määrama nimeruumist struktuuri nime. Siiski tundub, et see on iga kord pikk, nii et loon nimeruumi pseudonüümi. Näiteks saab "Microsoft.Xna.Framework.Rectangle" nüüd määrata kui "Xna.Rectangle".

taimer

Alates .NET Framework 3.0-st on saadaval taimeriklass nimega "System.Windows.Threading.DispatcherTimer" ja seda taimeriklassi kasutatakse iga kaadri renderdamiseks. WPF kasutab dispetšerTimerit, et lubada töötlemist kasutajaliidesega samal lõimel.

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

väli, deklareerides dispetšerTimeri.

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

Määratleb meetodi, mida DispatcherTimer helistab regulaarsete ajavahemike järel.

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

See on taimeri seadistamise protsess. Pärast DispatcherTimeri eksemplari loomist ning helistamismeetodi ja ajavahemiku seadistamist käivitab DispatcherTimer.Start meetod taimeri.

Akna käepideme saamine

Direct3D-seadme loomiseks vajate aknapidet. Kuid WPF-il pole aknakäepideme kontseptsiooni, seega pole seda võimalik otse aknaklassist saada.

Kuna aga on olemas aegu, kus on vaja akna käepidet, nagu antud juhul, saab akna käepideme saada "System.Windows.Interop.WindowInteropHelper" klassi kaudu Win32 koodi interopina. (see on klass Window)

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

Kasutage seda pidet Direct3D-seadme loomisel. Kui aga proovite akna käepidet saada OnInitialized meetodil, tagastab see 0, tõenäoliselt seetõttu, et akent pole veel loodud. Selles proovis luuakse seade OnSourceInitialized meetodil.

Renderdage määratud alale

Saate määrata sihtala GraphicsDevice.Present teise argumendina. Proovis püüan selle nihkena joonistada asendisse (50, 50). Suurus on sama, mis backbufferi suurus (300, 300). Esimene argument on ala, millest joonistada, ja kui null on määratud, kasutatakse algset puhvrit.

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

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

Seadme hävitamine

Hävitate akna sulgemisel oma seadme. Algselt tahtsin sellega hakkama saada käsutusmeetodiga, kuid kuna WPF Window klass ei päri vaikimisi IDisposable'i, kirjutasin selle hoopis siia.

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

Täitmise

Kui käivitate näidisprogrammi, saate seda käivitada ekraanipildiga, nagu see, mis on artikli alguses.

Esmapilgul renderdab see hästi, kuid kui ma akna suurust hiirega lohistades muudan, vilgub või kaob vaade suuruse muutmise ajal. Tundub, et see on vastuolus WPF-i renderdamisega ja ma proovisin palju asju, kuid ei suutnud seda lahendada.

Kui kasutate XNA-d, tundub WindowsFormsHosti juhtelemendi kasutamine turvalisem.

Programm nõuab .NET Framework 3.0, uusimat DirectX-i käitusaega ja Microsoft XNA Framework Redistributable 2.0. Lisaks on riistvaranõudena nõutav "graafikakaart, mis toetab Pixel Shader 1.1 või uuemat versiooni".

Lisaks loodi projekt "Visual Studio 2008 Professional Edition". Valmistage keskkond ette Visual Studio 2008 jaoks.