XNA-näkymän näyttäminen suoraan WPF-ikkunassa
yhteenveto
Tässä artikkelissa kuvataan, miten hahmonnetaan suoraan WPF-ikkunassa XNA:n avulla.
Toimintaympäristö
Edellytykset
Tuetut XNA-versiot |
|
Tuetut alustat |
|
Windowsin vaatima Vertex Shader -versio | 1.1 |
Windowsin vaatima Pixel Shader -versio | 1.1 |
Toimintaympäristö
lava |
aine
Kohdassa XNA:n käyttäminen WPF-sovelluksissa käytin WindowsFormsHost-ohjausobjektia näkymän näyttämiseen, mutta nyt haluan käyttää vain WPF-ikkunaa monikulmion näyttämiseen. "XNA: n käyttö WPF-sovelluksissa" on vähän esitys, joten selitän erot.
Nimitilan aliakset
// 名前空間エイリアス
using Xna = Microsoft.Xna.Framework;
using XnaGraphics = Microsoft.Xna.Framework.Graphics;
Koska XNA Framework- ja WPF-nimitilat kattavat väri- ja matriisirakenteet, rakenteen nimi on määritettävä nimitilasta, jotta sitä voidaan käyttää. Se näyttää kuitenkin olevan pitkä joka kerta, joten luon nimiavaruuden aliaksen. Esimerkiksi "Microsoft.Xna.Framework.Rectangle" voidaan nyt määrittää nimellä "Xna.Rectangle".
ajastin
.NET Framework 3.0:sta lähtien ajastinluokka nimeltä "System.Windows.Threading.DispatcherTimer" on ollut käytettävissä, ja tätä ajastinluokkaa käytetään jokaisen kehyksen hahmontamiseen. WPF käyttää DispatcherTimeriä salliakseen käsittelyn samassa säikeessä käyttöliittymän kanssa.
<summary>
タイマー
</summary>
private DispatcherTimer timer = null;
-kenttään, jossa ilmoitetaan DispatcherTimer.
<summary>
タイマーイベント
</summary>
<param name="sender"></param>
<param name="e"></param>
private void dispatcherTimer_Tick(object sender, EventArgs e)
{
this.Draw();
}
Määrittää menetelmän, jota DispatcherTimer kutsuu säännöllisin väliajoin.
// タイマー
this.timer = new DispatcherTimer();
this.timer.Tick += new EventHandler(dispatcherTimer_Tick);
this.timer.Interval = new TimeSpan(0, 0, 0, 0, 16);
this.timer.Start();
Tämä on ajastimen asettamisprosessi. Kun olet luonut DispatcherTimer-esiintymän ja määrittänyt kutsumenetelmän ja aikavälin, DispatcherTimer.Start-menetelmä käynnistää ajastimen.
Ikkunakahvan hankkiminen
Direct3D-laitteen luomiseen tarvitaan ikkunan kahva. WPF: llä ei kuitenkaan ole ikkunakahvan käsitettä, joten sitä ei ole mahdollista saada suoraan Window-luokasta.
Koska on kuitenkin aikoja, jolloin tarvitaan ikkunakahvaa, kuten tässä tapauksessa, ikkunan kahva voidaan saada "System.Windows.Interop.WindowInteropHelper" -luokan kautta Win32-koodin interopiksi. (tämä on Window-luokka)
// ウィンドウハンドルを取得する
IntPtr handle = new WindowInteropHelper(this).Handle;
Käytä tätä kahvaa, kun luot Direct3D-laitetta. Jos kuitenkin yrität saada ikkunan kahvan OnInitialized-menetelmässä, se palauttaa 0, luultavasti siksi, että ikkunaa ei ole vielä luotu. Tässä esimerkissä laite luodaan OnSourceInitialized-menetelmällä.
Hahmonna määritetylle alueelle
Voit määrittää kohdealueen GraphicsDevice.Presentin toiseksi argumentiksi. Näytteessä yritän piirtää sen kohtaan (50, 50) siirtymänä. Koko on sama kuin takapuskurin koko (300, 300). Ensimmäinen argumentti on alue, josta vedetään, ja jos null on määritetty, käytetään alkuperäistä puskuria.
// 描画先を指定する
Xna.Rectangle rect = new Xna.Rectangle(
50, 50,
(int)this.viewSize.Width, (int)this.viewSize.Height);
this.device.Present(null, rect, this.windowHandle);
Laitteen tuhoaminen
Tuhoat laitteen, kun suljet ikkunan. Alun perin halusin käsitellä sitä Dispose -menetelmällä, mutta koska WPF Window -luokka ei peri IDisposablea oletuksena, kirjoitin sen tänne.
<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);
}
teloitus
Jos suoritat esimerkkiohjelman, voit suorittaa sen artikkelin alussa olevan kaltaisella näyttökuvalla.
Ensi silmäyksellä se renderöi hyvin, mutta kun muutan ikkunan kokoa vetämällä sitä hiirellä, näkymä välkkyy tai katoaa koon muuttamisen aikana. Se näyttää olevan ristiriidassa WPF-renderöinnin kanssa, ja yritin monia asioita, mutta en pystynyt ratkaisemaan sitä.
Jos käytät XNA:ta, vaikuttaa turvallisemmalta käyttää WindowsFormsHost-ohjausobjektia.
Ohjelma vaatii .NET Framework 3.0:n, uusimman DirectX runtimen ja Microsoft XNA Framework Redistributable 2.0:n. Lisäksi laitteistovaatimuksena tarvitaan "näytönohjain, joka tukee Pixel Shader 1.1:tä tai uudempaa".
Lisäksi projekti luotiin "Visual Studio 2008 Professional Edition" -versiossa. Valmistele ympäristö Visual Studio 2008:aa varten.