Программирование - это просто
Advertisement
Главная arrow Уроки C# arrow Пишем компьютерную игру на C# arrow Пишем компьютерную игру на C#. Урок 4. Рисование фигуры (VertexBuffer, PresentParameters)
19.04.2024 г.
Главное меню
Главная
Интернет магазин
Программные продукты
Биржевые роботы
Искусственный интеллект
Математика и информатика
1С:Предприятие
Уроки C#
Уроки Delphi
Уроки программирования
Web-программирование
Дизайн и графика
Компьютер для блондинок
Исходники
Статьи
Платный раздел
Рассказы про компьютеры
Хитрости и секреты
Системный подход
Размышления
Наука для чайников
Друзья сайта
Excel-это не сложно
Все о финансах
.
Пишем компьютерную игру на C#. Урок 4. Рисование фигуры (VertexBuffer, PresentParameters) Печать E-mail
Автор megabax   
16.09.2011 г.
New Page 2

Пишем компьютерную игру на C#. Урок 4. Рисование фигуры (VertexBuffer, PresentParameters)

Исходники к уроку вы можете скачать здесь.

На уроке 3 мы научились инициализировать DirectX. Сегодня мы научимся рисовать при помощи DirectX геометрическую фигуру. Вот такую:

Пишем компьютерную игру на C#. Урок 4. Рисование фигуры (VertexBuffer, PresentParameters)

Для рисования такой фигуры нам потребуются классы 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 попробуем поменять координаты одной либо нескольких вершин:

Пишем компьютерную игру на C#. Урок 4. Рисование фигуры (VertexBuffer, PresentParameters)

Расцветку (свойство вершины Color):

Пишем компьютерную игру на C#. Урок 4. Рисование фигуры (VertexBuffer, PresentParameters)

 


Скриншоты, приведенные в данной статье, являются цитатами и иллюстрациями   программного продукта "Microsoft Visual Studio 2010", авторское право на который принадлежит Microsoft


 

 

Последнее обновление ( 06.11.2011 г. )
 
« След.   Пред. »
 
© 2024 Программирование - это просто
Joomla! - свободное программное обеспечение, распространяемое по лицензии GNU/GPL.
Русская локализация © 2005-2008 Joom.Ru - Русский Дом Joomla!
Design by Mamboteam.com | Powered by Mambobanner.de
Я принимаю Яндекс.Деньги