Использование XNA в Windows Forms

Сентябрь 5th, 2011 § 0 comments

В этом посте я расскажу как подружить XNA и Windows Forms. Я знаю что сейчас Windows Forms менее актуально, чем тот же WPF, но придет время и я напишу и под WPF. Итак, приступим, у нас есть проект Windows Forms. Первое что нам нужно это подключить  библиотеку XNA, идем в Add Reference и выбираем Microsoft.XNA.Framework. Следует знать, что существует конфликт между пространством имен System.Drawing и Microsoft.XNA.Framework так что вы определенных случая придется указывать полный тип переменной, для того что бы упростить этот процесс воспользуйтесь этим способом using  _Xna=Microsoft.XNA.Framework. Ни чего не могу сказать про XNA 4.0 но под XNA 3.0 тип процессора нужно выставить x86 иначе проект не соберется, имейте это ввиду.

Следующим этапом будет  создание контекста графического устройства, т.е. той поверхности, на которой мы собрались рисовать, для примера это будет сама форма.


public MainForm()
 {
 InitializeComponent();
 Present = new Microsoft.Xna.Framework.Graphics.PresentationParameters();
 Present.BackBufferHeight = this.Height;
 Present.BackBufferWidth = this.Width;
 Present.IsFullScreen = false;
 Device = new Microsoft.Xna.Framework.Graphics.GraphicsDevice(_XnaGraphics.GraphicsAdapter.DefaultAdapter, _XnaGraphics.DeviceType.Hardware, this.Handle, Present);
 this.Texture = _XnaGraphics.Texture2D.FromFile(this.Device, "tile_01.png");
 Sprite = new Microsoft.Xna.Framework.Graphics.SpriteBatch(this.Device);
 }

После этого нам нужно обрабатывать следующие события это перерисовка формы, изменение размеров рабочей области. Это можно сделать следующим образом.


private void OnPaint(object sender, PaintEventArgs e)
 {
 Device.Clear(_XnaGraphics.Color.LightSteelBlue);
 Sprite.Begin();
 Sprite.Draw(this.Texture, new Microsoft.Xna.Framework.Rectangle(10, 10, 40, 40), _XnaGraphics.Color.White);
 Sprite.End();
 Device.Present();
 }

 private void OnResize(object sender, EventArgs e)
 {
 if (this.Height == 0 || this.Width == 0 || this.Device == null)
 return;
 this.Present = new Microsoft.Xna.Framework.Graphics.PresentationParameters();
 this.Present.BackBufferHeight = this.Height;
 this.Present.BackBufferWidth = this.Width;
 this.Device.Reset(this.Present);

 }

Здесь для наглядности я еще загружаю текстуру чтобы её вывести. Вот полный код класса формы.


using System;
using System.Windows.Forms;
using _XnaGraphics = Microsoft.Xna.Framework.Graphics;

namespace WinFormXNABlog
{
 public partial class MainForm : Form
 {
 public MainForm()
 {
 InitializeComponent();
 Present = new Microsoft.Xna.Framework.Graphics.PresentationParameters();
 Present.BackBufferHeight = this.Height;
 Present.BackBufferWidth = this.Width;
 Present.IsFullScreen = false;
 Device = new Microsoft.Xna.Framework.Graphics.GraphicsDevice(_XnaGraphics.GraphicsAdapter.DefaultAdapter, _XnaGraphics.DeviceType.Hardware, this.Handle, Present);
 this.Texture = _XnaGraphics.Texture2D.FromFile(this.Device, "tile_01.png");
 Sprite = new Microsoft.Xna.Framework.Graphics.SpriteBatch(this.Device);
 }
 private _XnaGraphics.GraphicsDevice Device;
 private _XnaGraphics.PresentationParameters Present;
 private _XnaGraphics.Texture2D Texture;
 private _XnaGraphics.SpriteBatch Sprite;

 private void OnPaint(object sender, PaintEventArgs e)
 {
 Device.Clear(_XnaGraphics.Color.LightSteelBlue);
 Sprite.Begin();
 Sprite.Draw(this.Texture, new Microsoft.Xna.Framework.Rectangle(10, 10, 40, 40), _XnaGraphics.Color.White);
 Sprite.End();
 Device.Present();
 }

 private void OnResize(object sender, EventArgs e)
 {
 if (this.Height == 0 || this.Width == 0 || this.Device == null)
 return;
 this.Present = new Microsoft.Xna.Framework.Graphics.PresentationParameters();
 this.Present.BackBufferHeight = this.Height;
 this.Present.BackBufferWidth = this.Width;
 this.Device.Reset(this.Present);

 }
 }
}

Этого минимума достаточно чтобы начать работу с XNA в WinForms приложении. Интересные статьи по теме можно взять отсюда.

Easy Rendering with XNA Inside a Windows Form

Hosting XNA in a Window

XNA Batched Text Output

Дружим XNA и WPF

Rendering with XNA Framework 4.0 inside of a WPF application

WinForms Series 1: Graphics Device

Оставить комментарий

Ваш email не будет опубликован. Обязательные поля отмечены *

Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Смотреть фильмы онлайн