XNA skata parādīšana tieši WPF logā
Kopsavilkuma
Aprakstīts, kā atveidot tieši WPF logā ar XNA.
Darbības vide
Priekšnoteikumi
Atbalstītās XNA versijas |
|
Atbalstītās platformas |
|
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.