В этом посте я расскажу как подружить 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
Rendering with XNA Framework 4.0 inside of a WPF application
WinForms Series 1: Graphics Device
Оставить комментарий