XNA kasutamine WPF-i rakendustes
Kokkuvõte
Kirjeldab, kuidas kasutada XNA raamistikku WPF-rakendustes.
Töökeskkond
Eeltingimused
Toetatud XNA versioonid |
|
Toetatud platvormid |
|
Windowsi nõutav vertex shaderi versioon | 1.1 |
Windowsi nõutav versioon Pixel Shader | 1.1 |
Töökeskkond
platvorm |
aine
Konkreetse juhtelemendi renderdamiseks DirectX-i abil peate hankima selle juhtelemendi akna käepideme. Erinevalt Windowsi vormi juhtelementidest ei ole WPF-i juhtelementidel aknakäepidemeid (WPF-is nad lihtsalt "joonistavad" juhtnuppu).
Kuid WPF pakub juhtelementi nimega "WindowsFormsHost", mis võimaldab teil kasutada Windows Formsi juhtelemente.
Selles artiklis loome hulknurga joonistamise näidise, kuna seda pööratakse, nagu eespool näidatud, kuid jätan XNA enda üksikasjad välja, sest selle selgitamine oleks liiga pikk. Ma räägin lihtsalt WPF-i ja XNA suhetest.
Kõigepealt avage WPF-aken (antud juhul Window1.xaml) ja asetage tööriistaribalt WindowsFormHosti juhtelement. Parempoolne liugur on boonus.
Mul on tõesti vaja XAML-iga veidi rohkem tööd teha, kuid jätan selle hilisemaks, sest pean kõigepealt looma XNA kasutamiseks juhtnupud.
Lisage oma projektile "Windows Forms" "Kohandatud juhtelement". Jätke nimi GraphicsDeviceControl.
Ärge unustage eelnevalt lisada viidet "Microsoft.Xna.Framework". Samuti on olemas "Microsoft.Xna.Framework.Game", kuid seda kasutatakse ainult mängu projektis, seega ei ole vaja seda lisada.
Näidiskoodi lühikesena hoidmiseks on kõik XNA-ga seotud programmid kokku võetud GraphicsDeviceControl.cs. See ei ole väga mitmekülgne kirjutamisstiil, nii et palun rakendage seda ja kirjutage see ümber.
GraphicsDeviceControli täielik kood on näidatud allpool (välja arvatud kujundaja osa). Kui olete kunagi XNA-d kasutanud, teate, et see ei tee midagi ebatavalist. Ma kasutan taimeri komponenti, et hulknurk näiks kogu aeg pöörlevat.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
namespace XNAOnWPF
{
<summary>
グラフィックデバイスコントロール
</summary>
public partial class GraphicsDeviceControl : Control
{
<summary>
グラフィックデバイス
</summary>
private GraphicsDevice device = null;
<summary>
エフェクト
</summary>
private BasicEffect effect = null;
<summary>
頂点データ
</summary>
private VertexPositionColor[] vertices = new VertexPositionColor[3];
<summary>
頂点データ
</summary>
public VertexPositionColor[] Vertices
{
get { return this.vertices; }
}
<summary>
コンストラクタ
</summary>
public GraphicsDeviceControl()
{
InitializeComponent();
}
<summary>
コントロールが作成されるとき
</summary>
protected override void OnCreateControl()
{
if (this.DesignMode == false)
{
try
{
// デバイス作成
PresentationParameters pp = new PresentationParameters();
pp.SwapEffect = SwapEffect.Discard;
pp.BackBufferWidth = 300;
pp.BackBufferHeight = 300;
pp.EnableAutoDepthStencil = true;
pp.AutoDepthStencilFormat = DepthFormat.Depth16;
this.device = new GraphicsDevice(GraphicsAdapter.DefaultAdapter,
DeviceType.Hardware, this.Handle, pp);
// 頂点データの設定
this.vertices[0] = new VertexPositionColor(
new Vector3(0.0f, -2.0f + (float)Math.Sqrt(3) * 3.0f, 0.0f),
new Microsoft.Xna.Framework.Graphics.Color(255, 0, 0));
this.vertices[1] = new VertexPositionColor(
new Vector3(3.0f, -2.0f, 0.0f),
new Microsoft.Xna.Framework.Graphics.Color(0, 255, 0));
this.vertices[2] = new VertexPositionColor(
new Vector3(-3.0f, -2.0f, 0.0f),
new Microsoft.Xna.Framework.Graphics.Color(0, 0, 255));
// 頂点定義
this.device.VertexDeclaration =
new VertexDeclaration(this.device, VertexPositionColor.VertexElements);
// エフェクト
this.effect = new BasicEffect(this.device, null);
this.effect.VertexColorEnabled = true;
// ビュー変換行列を設定
this.effect.View = Matrix.CreateLookAt(
new Vector3(0.0f, 0.0f, -10.0f),
new Vector3(0.0f, 0.0f, 0.0f),
Vector3.Up);
// 射影変換を設定
this.effect.Projection = Matrix.CreatePerspectiveFieldOfView(
MathHelper.ToRadians(45.0f), 1.0f, 1.0f, 100.0f);
// レンダリングステート設定
this.device.RenderState.CullMode = CullMode.None;
this.device.RenderState.AlphaBlendEnable = true;
this.device.RenderState.SourceBlend = Blend.SourceAlpha;
this.device.RenderState.DestinationBlend = Blend.InverseSourceAlpha;
}
catch (Exception ex)
{
Trace.WriteLine(ex.ToString());
}
}
base.OnCreateControl();
}
<summary>
使用中のリソースをすべてクリーンアップします。
</summary>
<param name="disposing">マネージ リソースが破棄される場合 true、破棄されない場合は false です。</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
if (disposing)
{
if (this.device != null)
{
this.device.Dispose();
}
}
base.Dispose(disposing);
}
<summary>
描画イベント
</summary>
<param name="pe"></param>
protected override void OnPaint(PaintEventArgs pe)
{
this.Draw();
base.OnPaint(pe);
}
<summary>
描画
</summary>
private void Draw()
{
if (this.device == null)
{
return;
}
this.device.Clear(Microsoft.Xna.Framework.Graphics.Color.DarkBlue);
// ポリゴンを描画する
this.effect.Begin();
this.effect.Techniques[0].Passes[0].Begin();
this.effect.World = Matrix.CreateRotationY((float)Environment.TickCount / 1000.0f);
this.device.DrawUserPrimitives<VertexPositionColor>(
PrimitiveType.TriangleList, vertices, 0, 1);
this.effect.Techniques[0].Passes[0].End();
this.effect.End();
this.device.Present();
}
<summary>
タイマーイベント
</summary>
<param name="sender"></param>
<param name="e"></param>
private void timer_Tick(object sender, EventArgs e)
{
this.Draw();
}
}
}
Nüüd, kui olete juhtelemendi loonud, vaatame XAML-i. Kuna paigutame loodud juhtelemendi, lisame juursildile nimeruumi. Siin on see määratletud kui "xw".
<Window x:Class="ManagedDirectXOnWPF.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="WPFウインドウ上でManaged DirectXを使用してポリゴン描画"
Height="338" Width="422"
xmlns:my="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration"
xmlns:xw="clr-namespace:ManagedDirectXOnWPF">
<!-- 省略 -->
</Window>
Järgmisena laiendage äsja paigutatud WindowsFormsHosti juhtelemendi silti ja lisage GraphicsDeviceControl, nagu allpool näidatud.
<my:WindowsFormsHost Name="windowsFormsHostManagedDirectX" Width="300" Height="300"
HorizontalAlignment="Left" VerticalAlignment="Top">
<xw:GraphicsDeviceControl x:Name="GraphicsDeviceControl" />
</my:WindowsFormsHost>
Teil ei pea olema "x:Name", kuid näidis kasutab seda liuguriga tipuandmetele juurdepääsemiseks.
Kui te seda teete, saate WPF-is käivitada stseeni, kus hulknurgad joonistatakse pöörleva hulknurgaga, nagu on näidatud proovis. Juurdepääs liuguriga on boonus, seega laadige alla näidisandmed ja kontrollige neid.
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.