New Page 2
Пишем компьютерную игру на
C#. Урок 4. Рисование фигуры (VertexBuffer,
PresentParameters)
Исходники к уроку вы можете скачать
здесь.
На
уроке 3
мы
научились инициализировать DirectX. Сегодня мы
научимся рисовать при помощи DirectX геометрическую
фигуру. Вот такую:
Для рисования такой фигуры нам потребуются классы
VertexBuffer и GraphicsStream, которые объявлены в модуле
Microsoft.DirectX.Direct3D. Подключать эту библиотеку и инициализировать ее вы
уже умеете из
урока 3. Поэтому
берем исходники
прошлого урока и
правим их. Для начала нам надо добавить в форму FormChild ссылку на объект
VertexBuffer (выделено серым фоном) :
public partial
class FormChild
: Form
{
private Device
device=null;
private
VertexBuffer vertexBuffer;
public FormChild()
{
InitializeComponent();
}
...
|
Теперь немного доработает метод initializeDirectX, нам надо
создать этот самый VertexBuffer:
public bool
initializeDirectX()
{
try
{
PresentParameters
presPars = new
PresentParameters();
presPars.Windowed = true;
presPars.SwapEffect = SwapEffect.Discard;
device = new
Device(0,
DeviceType.Hardware, this,
CreateFlags.SoftwareVertexProcessing,
presPars);
this.OnCreateDevice(device,
null);
return
true;
}
catch (DirectXException
e)
{
MessageBox.Show("Ошибка
инициализации
DirectX "+e.ErrorString);
return
false;
}
} |
Создание объекта VertexBuffer реализовано в методе
OnCreateDevice формы FormChild:
public void
OnCreateDevice(object sender,
EventArgs e)
{
//создаем
буфер
для
вершин
треугольника
vertexBuffer = new
VertexBuffer(
typeof(CustomVertex.TransformedColored),
3,
device,
0,
CustomVertex.TransformedColored.Format,
Pool.Default);
vertexBuffer.Created += new
System.EventHandler(this.OnCreateVertexBuffer);
this.OnCreateVertexBuffer(vertexBuffer,null);
} |
Мы "перехватили" события объекта VertexBuffer:
vertexBuffer.Created += new
System.EventHandler(this.OnCreateVertexBuffer);
this.OnCreateVertexBuffer(vertexBuffer,null);
|
реализуем его, заполним координаты и цвета вершин нашего
треугольника, а так же выведя фигуру в графический поток:
public void
OnCreateVertexBuffer(object sender,
EventArgs e)
{
GraphicsStream graphicsStream
= vertexBuffer.Lock(0, 0, 0);
CustomVertex.TransformedColored[]
vertex=new
CustomVertex.TransformedColored[3];
//вершина
0
vertex[0].X = 150;
vertex[0].Y = 50;
vertex[0].Z = 0.5f;
vertex[0].Rhw = 1;
vertex[0].Color = System.Drawing.Color.Black.ToArgb();
//вершина
1
vertex[1].X = 250;
vertex[1].Y = 70;
vertex[1].Z = 0.5f;
vertex[1].Rhw = 1;
vertex[1].Color = System.Drawing.Color.LightPink.ToArgb();
//вершина
2
vertex[2].X = 50;
vertex[2].Y = 250;
vertex[2].Z = 0.5f;
vertex[2].Rhw = 1;
vertex[2].Color = System.Drawing.Color.Aqua.ToArgb();
//вывод
графической
фигуры
graphicsStream.Write(vertex);
vertexBuffer.Unlock();
} |
Теперь нам осталось переписать процедуру рендеринга:
public void
rendering()
{
if (device ==
null) return;
//очищает и заливает белым цветом устройство
(форму)
device.Clear(ClearFlags.Target,
System.Drawing.Color.White, 1.0f, 0);
//выводим
сцену
device.BeginScene();
device.SetStreamSource(0, vertexBuffer, 0);
device.VertexFormat = CustomVertex.TransformedColored.Format;
device.DrawPrimitives(PrimitiveType.TriangleList,
0, 1);
device.EndScene();
device.Present();
} |
Все, программу можно компилировать и запускать на
тестирование. Если все сделано правильно, то вы увидите на экране фигуру,
которую я показал выше.
Теперь немножко поэкспериментируем. В процедуре
OnCreateVertexBuffer попробуем поменять координаты одной либо нескольких вершин:
Расцветку (свойство вершины Color):
Скриншоты, приведенные в данной статье,
являются цитатами и иллюстрациями программного
продукта "Microsoft Visual Studio 2010", авторское право на
который принадлежит Microsoft.
|