Prikaz pogleda XNA neposredno v oknu WPF
Povzetek
Opisuje, kako upodabljati neposredno v oknu WPF z XNA.
Delovno okolje
Predpogoji
Podprte različice XNA |
|
Podprte platforme |
|
Zahtevana različica brilnika točk v sistemu Windows | 1.1 |
Windows je zahteval različico Pixel Shader | 1.1 |
Delovno okolje
peron |
snov
V razdelku Uporaba XNA v aplikacijah WPF sem za prikaz pogleda uporabil kontrolnik WindowsFormsHost, zdaj pa želim za prikaz mnogokotnika uporabiti samo okno WPF. "Uporaba XNA v aplikacijah WPF" je nekoliko predstavitev, zato bom razložil razlike.
Vzdevki imenskega prostora
// 名前空間エイリアス
using Xna = Microsoft.Xna.Framework;
using XnaGraphics = Microsoft.Xna.Framework.Graphics;
Ker sta strukturi Color in Matrix pokriti v imenskih prostorih XNA Framework in WPF, morate določiti ime strukture iz imenskega prostora, da jo lahko uporabite. Vendar se zdi, da je vsakič dolg, zato ustvarjam vzdevek imenskega prostora. Na primer, »Microsoft.Xna.Framework.Rectangle« lahko zdaj določite kot »Xna.Rectangle«.
Časovnik
Od ogrodja .NET Framework 3.0 je na voljo časovni razred, imenovan »System.Windows.Threading.DispatcherTimer«, in ta časovni razred se uporablja za upodabljanje vsakega okvirja. WPF uporablja DispatcherTimer za omogočanje obdelave v isti niti kot uporabniški vmesnik.
<summary>
タイマー
</summary>
private DispatcherTimer timer = null;
, ki razglasi DispatcherTimer.
<summary>
タイマーイベント
</summary>
<param name="sender"></param>
<param name="e"></param>
private void dispatcherTimer_Tick(object sender, EventArgs e)
{
this.Draw();
}
Določa metodo, ki jo DispatcherTimer kliče v rednih časovnih presledkih.
// タイマー
this.timer = new DispatcherTimer();
this.timer.Tick += new EventHandler(dispatcherTimer_Tick);
this.timer.Interval = new TimeSpan(0, 0, 0, 0, 16);
this.timer.Start();
To je postopek nastavitve časovnika. Ko ustvarite primerek DispatcherTimer in nastavite metodo za klic in časovni interval, metoda DispatcherTimer.Start zažene časovnik.
Pridobitev okenske kljuke
Če želite ustvariti napravo Direct3D, potrebujete ročico za okno. Vendar WPF nima koncepta okenske ročice, zato ga ni mogoče dobiti neposredno iz razreda Window.
Ker pa obstajajo časi, ko je potrebna okenska ročica, kot v tem primeru, lahko okensko ročico dobite prek razreda »System.Windows.Interop.WindowInteropHelper« kot interop za kodo Win32. (to je razred Window)
// ウィンドウハンドルを取得する
IntPtr handle = new WindowInteropHelper(this).Handle;
Ta ročico uporabite pri ustvarjanju naprave Direct3D. Če pa poskusite dobiti ročico okna v metodi OnInitialized, bo vrnila 0, verjetno zato, ker okno še ni bilo ustvarjeno. V tem vzorcu je naprava ustvarjena v metodi OnSourceInitialized.
Upodabljanje na določeno območje
Ciljno območje lahko določite kot drugi argument GraphicsDevice.Present. V vzorcu ga poskušam narisati na mestu (50, 50) kot odmik. Velikost je enaka velikosti povratnega medpomnilnika (300, 300). Prvi argument je območje, iz katerega je treba črpati, in če je določena null, se uporabi izvirni medpomnilnik.
// 描画先を指定する
Xna.Rectangle rect = new Xna.Rectangle(
50, 50,
(int)this.viewSize.Width, (int)this.viewSize.Height);
this.device.Present(null, rect, this.windowHandle);
Uničenje naprave
Ko zaprete okno, uničite napravo. Prvotno sem ga želel obravnavati z metodo Dispose, ker pa razred WPF Window privzeto ne podeduje IDisposable, sem ga namesto tega napisal tukaj.
<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);
}
usmrtitev
Če zaženete vzorčni program, ga lahko zaženete s sliko zaslona, kot je ta na začetku članka.
Na prvi pogled se dobro upodablja, ko pa spremenim velikost okna tako, da ga povlečem z miško, pogled med spreminjanjem velikosti utripa ali izgine. Zdi se, da je v nasprotju z upodabljanjem WPF in poskusil sem veliko stvari, vendar tega nisem mogel rešiti.
Če uporabljate XNA, se vam zdi varneje uporabiti kontrolnik WindowsFormsHost.
Program zahteva ogrodje .NET Framework 3.0, najnovejši izvajalnik DirectX in Microsoft XNA Framework Redistributable 2.0. Poleg tega je kot strojna zahteva potrebna »grafična kartica, ki podpira Pixel Shader 1.1 ali novejšo različico«.
Poleg tega je bil projekt ustvarjen v "Visual Studio 2008 Professional Edition". Pripravite okolje za Visual Studio 2008.