XNA izmantošana WPF lietojumprogrammās
Kopsavilkuma
Apraksta, kā izmantot XNA Framework WPF lietojumprogrammās.
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
Lai atveidotu noteiktu vadīklu, izmantojot DirectX, ir jāiegūst šīs vadīklas loga turis. Tomēr, atšķirībā no Windows formas vadīklām, WPF vadīklām nav logu rokturu (WPF tās vienkārši "uzzīmē" vadīklu).
Tomēr WPF nodrošina vadīklu ar nosaukumu "WindowsFormsHost", kas ļauj izmantot Windows veidlapu vadīklas.
Šajā rakstā mēs izveidosim daudzstūra zīmēšanas paraugu, jo tas tiek pagriezts, kā parādīts iepriekš, bet es izlaidīšu pašas XNA detaļas, jo tas būtu pārāk garš, lai to izskaidrotu. Es tikai runāšu par attiecībām starp WPF un XNA.
Vispirms atveriet WPF logu (šajā gadījumā Window1.xaml) un rīkjoslā ievietojiet WindowsFormHost vadīklu. Slīdnis labajā pusē ir bonuss.
Man patiešām ir jādara nedaudz vairāk darba pie XAML, bet es to atstāšu vēlāk, jo man ir jāizveido vadīklas, lai vispirms izmantotu XNA.
Pievienojiet projektam "Windows Forms" "Custom Control". Atstājiet nosaukumu GraphicsDeviceControl.
Neaizmirstiet iepriekš pievienot atsauci "Microsoft.Xna.Framework". Ir arī "Microsoft.Xna.Framework.Game", taču tas tiek izmantots tikai spēles projektā, tāpēc nav nepieciešams to iekļaut.
Lai parauga kods būtu īss, visas ar XNA saistītās programmas ir apkopotas GraphicsDeviceControl.cs. Tas nav ļoti daudzpusīgs rakstīšanas stils, tāpēc, lūdzu, izmantojiet to un pārrakstiet to.
Pilns GraphicsDeviceControl kods ir parādīts zemāk (izņemot dizainera daļu). Ja jūs kādreiz esat izmantojis XNA, jūs zināt, ka tas nedara neko neparastu. Es izmantoju taimera komponentu, lai liktu daudzstūrim visu laiku griezties.
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();
}
}
}
Tagad, kad esat izveidojis vadīklu, apskatīsim XAML. Tā kā mēs izvietosim izveidoto vadīklu, saknes tagam pievienosim nosaukumvietu. Šeit tas ir definēts kā "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>
Pēc tam izvērsiet tikko ievietotās WindowsFormsHost vadīklas tagu un pievienojiet GraphicsDeviceControl, kā parādīts tālāk.
<my:WindowsFormsHost Name="windowsFormsHostManagedDirectX" Width="300" Height="300"
HorizontalAlignment="Left" VerticalAlignment="Top">
<xw:GraphicsDeviceControl x:Name="GraphicsDeviceControl" />
</my:WindowsFormsHost>
Jums nav jābūt "x:Name", bet paraugs to izmanto, lai piekļūtu virsotņu datiem ar slīdni.
Ja to izdarīsit, varat palaist ainu WPF, kur daudzstūri tiek zīmēti ar rotējošu daudzstūri, kā parādīts paraugā. Piekļuve ar slīdni ir bonuss, tāpēc, lūdzu, lejupielādējiet parauga datus un pārbaudiet to.
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.