Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Жарков В.А. - Visual C++ 2005, DirectX 9.0c и Microsoft Agent в компьютерной графике, мультимедиа и играх (Листинги книги) - 2005

.pdf
Скачиваний:
306
Добавлен:
13.08.2013
Размер:
1.14 Mб
Скачать

170 Жарков В.А. Компьютерная графика, мультимедиа и игры на Visual C++ 2005

x1 = x2; y1 = y2;

x2 = myArrayVC[2, 0]; y2 = myArrayVC[2, 1]; e->Graphics->DrawLine(myPen, x1, y1, x2, y2); x1 = x2; y1 = y2;

x2 = myArrayVC[3, 0]; y2 = myArrayVC[3, 1]; e->Graphics->DrawLine(myPen, x1, y1, x2, y2);

}

Часть VI. Методология создания анимационной трехмерной графики на основе новых версий Visual C++ и DirectX

Глава 36. Методика проектирования неподвижных и подвижных плоских фигур

Листинг 36.1. Метод для вывода следующего вида формы и рисования графики.

private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e)

{

//В классе Form1 создаем экземпляр формы myForm1: Form1^ myForm1 = gcnew Form1();

//Инициализируем DirectX:

if (!myForm1->InitializeDirectX())

{

MessageBox::Show("Ошибка инициализации DirectX."); return;

}

//Показываем форму Form1: myForm1->Show();

//Рисуем графику на форме Form1: while (myForm1->Created)

{

myForm1->myRendering(); Application::DoEvents();

}

}

Листинг 36.2. Методы для визуализации преобразований.

//Объявляем и инициализируем глобальную переменную //для устройства myDevice класса Device:

static Device^ myDevice = nullptr;

//Устанавливаем параметры Direct3D: public: bool InitializeDirectX()

{

try

{

172 Жарков В.А. Компьютерная графика, мультимедиа и игры на Visual C++ 2005

PresentParameters^ myPresentParameters = gcnew PresentParameters();

myPresentParameters->Windowed = true; myPresentParameters->SwapEffect =

SwapEffect::Discard;

//Создаем устройство для визуализации вершин фигуры: myDevice = gcnew Device(0, DeviceType::Hardware,

this, CreateFlags::SoftwareVertexProcessing, myPresentParameters);

return true;

}

catch (DirectXException^)

{

//Перехвачена ошибка инициализации DirectX: return false;

}

}

//Метод для визуализации преобразований и построения графики: public: void myRendering()

{

if (myDevice == nullptr) return;

//Очищаем и заливаем белым цветом устр-во в виде Form1: myDevice->Clear(ClearFlags::Target,

System::Drawing::Color::White, 1.0f, 0); //Начинаем сцену:

myDevice->BeginScene(); //Заканчиваем сцену: myDevice->EndScene(); //Показываем сцену: myDevice->Present();

}

Листинг 36.3. Код для вывода формы Form1 и рисования на ней графики.

//В классе Form1 создаем экземпляр формы myForm1: Form1^ myForm1 = gcnew Form1();

//Инициализируем DirectX:

if (!myForm1->InitializeDirectX())

{

MessageBox::Show("Ошибка при инициализации DirectX."); return 0;

}

//Показываем форму Form1: myForm1->Show();

//Рисуем графику на форме Form1: while (myForm1->Created)

Глава 36. Методика проектирования плоских фигур

173

{

myForm1->myRendering(); Application::DoEvents();

}

return 0;

Листинг 36.4. Методы для визуализации преобразованных вершин фигуры.

//Объявляем и инициализируем глобальные переменные. //Для устройства myDevice класса Device:

static Device^ myDevice = nullptr; //Для буфера вершин VertexBuffer:

static VertexBuffer^ myVertexBuffer = nullptr; //Устанавливаем параметры Direct3D:

public: bool InitializeDirectX()

{

try

{

PresentParameters^ myPresentParameters = gcnew PresentParameters();

myPresentParameters->Windowed = true; myPresentParameters->SwapEffect =

SwapEffect::Discard;

//Создаем устройство для визуализации вершин фигуры: myDevice = gcnew Device(0, DeviceType::Hardware,

this, CreateFlags::SoftwareVertexProcessing, myPresentParameters);

//Вызываем разработанный нами метод OnCreateDevice: this->OnCreateDevice(myDevice, nullptr);

return true;

}

catch (DirectXException^)

{

//Перехвачена ошибка инициализации DirectX: return false;

}

}

//Метод для начала и окончания визуализации (rendering) //преобразованных вершин:

public: void myRendering()

{

if (myDevice == nullptr) return;

//Задаем белый цвет (Color::White) форме Form1: myDevice->Clear(ClearFlags::Target,

System::Drawing::Color::White, 1.0f, 0);

174 Жарков В.А. Компьютерная графика, мультимедиа и игры на Visual C++ 2005

//Начинаем сцену: myDevice->BeginScene(); //Начинаем рисование:

myDevice->SetStreamSource(0, myVertexBuffer, 0); myDevice->VertexFormat =

CustomVertex::TransformedColored::Format; myDevice->DrawPrimitives(

PrimitiveType::TriangleList, 0, 1); //Заканчиваем сцену: myDevice->EndScene();

//Показываем сцену: myDevice->Present();

}

//Создаем устройство, буфер вершин фигуры и их данные: public: void OnCreateDevice(Object^ sender, EventArgs^ e)

{

//Создаем буфер для 3-x вершин треугольника: myVertexBuffer = gcnew VertexBuffer(

typeid<CustomVertex::TransformedColored>, 3, myDevice, Microsoft::DirectX::Direct3D::Usage::Points, CustomVertex::TransformedColored::Format, Pool::Default);

//Создаем геометрические данные при обработке

//события myVertexBuffer->Created: myVertexBuffer->Created +=

gcnew System::EventHandler( this->OnCreateVertexBuffer);

this->OnCreateVertexBuffer(myVertexBuffer, nullptr);

}

//Создаем массив вершин и задаем их параметры:

public: static void OnCreateVertexBuffer(Object^ sender, EventArgs^ e)

{

//Создаем объект myGraphicsStream класса GraphicsStream //для потока графических данных:

GraphicsStream^ myGraphicsStream = myVertexBuffer-> Lock(0, 0, Microsoft::DirectX::Direct3D::LockFlags::Discard);

//Массив предопределенных пользовательских вершин

//(predefined custom vertex) в классе CustomVertex: array<CustomVertex::TransformedColored>^ Vertex =

gcnew array<CustomVertex::TransformedColored>(3); //В классе (структуре) Color создаем объект myColor: Color myColor = Color::FromArgb(0);

//Используем метод ToArgb

Глава 36. Методика проектирования плоских фигур

175

//для получения 32-bit ARGB-значение myColor: myColor = Color::FromArgb(myColor.ToArgb()); //Вершина 0:

//Координаты вершины:

Vertex[0].X = 150; Vertex[0].Y = 50; Vertex[0].Z = 0.5f; Vertex[0].Rhw = 1;

//Цвет вершины:

Vertex[0].Color = myColor.Aqua.ToArgb(); //Вершина 1:

//Координаты вершины:

Vertex[1].X = 250; Vertex[1].Y = 300; Vertex[1].Z = 0.5f; Vertex[1].Rhw = 1;

//Цвет вершины:

Vertex[1].Color = myColor.Black.ToArgb(); //Вершина 2:

//Координаты вершины:

Vertex[2].X = 50; Vertex[2].Y = 300; Vertex[2].Z = 0.5f; Vertex[2].Rhw = 1;

//Цвет вершины:

Vertex[2].Color = myColor.LightPink.ToArgb(); //Записываем поток графических данных

//в объект myGraphicsStream: myGraphicsStream->Write(Vertex); myVertexBuffer->Unlock();

}

Листинг 36.5. Методы для визуализации преобразованных вершин фигур.

//Объявляем и инициализируем глобальные переменные. //Общее устройство myDevice класса Device для всех фигур: static Device^ myDevice = nullptr;

//Буфер вершин VertexBuffer для треугольника: static VertexBuffer^ myVertexBuffer1 = nullptr; //Буфер вершин VertexBuffer для прямоугольника: static VertexBuffer^ myVertexBuffer2 = nullptr;

//Устанавливаем параметры Direct3D: public: bool InitializeDirectX()

{

try

{

//Для треугольника:

PresentParameters^ myPresentParameters1 = gcnew PresentParameters();

myPresentParameters1->Windowed = true; myPresentParameters1->SwapEffect =

SwapEffect::Discard;

176 Жарков В.А. Компьютерная графика, мультимедиа и игры на Visual C++ 2005

//Создаем устройство для визуализации вершин фигуры: myDevice = gcnew Device(0, DeviceType::Hardware,

this, CreateFlags::SoftwareVertexProcessing, myPresentParameters1);

//Вызываем разработанный нами метод OnCreateDevice: this->OnCreateDevice(myDevice, nullptr);

//Для прямоугольника:

PresentParameters^ myPresentParameters2 = gcnew PresentParameters();

myPresentParameters2->Windowed = true; myPresentParameters2->SwapEffect =

SwapEffect::Discard;

//Создаем устройство для визуализации вершин: myDevice = gcnew Device(0, DeviceType::Hardware,

this, CreateFlags::SoftwareVertexProcessing, myPresentParameters2);

//Вызываем разработанный нами метод OnCreateDevice: this->OnCreateDevice(myDevice, nullptr);

return true;

}

catch (DirectXException^)

{

//Перехвачена ошибка инициализации DirectX: return false;

}

}

//Метод для начала и окончания визуализации (rendering) //преобразованных вершин:

public: void myRendering()

{

if (myDevice == nullptr) return;

//Задаем белый цвет (Color::White) форме Form1: myDevice->Clear(ClearFlags::Target,

System::Drawing::Color::White, 1.0f, 0); //Начинаем сцену:

myDevice->BeginScene(); //Рисуем треугольник:

myDevice->SetStreamSource(0, myVertexBuffer1, 0); myDevice->VertexFormat =

CustomVertex::TransformedColored::Format; myDevice->DrawPrimitives(

PrimitiveType::TriangleList, 0, 1); //Рисуем прямоугольник:

myDevice->SetStreamSource(0, myVertexBuffer2, 0); myDevice->VertexFormat =

Глава 36. Методика проектирования плоских фигур

177

CustomVertex::TransformedColored::Format; myDevice->DrawPrimitives(

PrimitiveType::TriangleStrip, 0, 2); //Заканчиваем сцену: myDevice->EndScene();

//Показываем сцену: myDevice->Present();

}

//Создаем устройство, буфер вершин фигуры и их данные: public: void OnCreateDevice(Object^ sender, EventArgs^ e)

{

Device^ myDev = (Device^)sender;

//Создаем буфер для 3-x вершин треугольника: myVertexBuffer1 = gcnew VertexBuffer(

typeid<CustomVertex::TransformedColored>, 3, myDev, Microsoft::DirectX::Direct3D::Usage::Points, CustomVertex::TransformedColored::Format, Pool::Default);

//Создаем геометрические данные при обработке

//события myVertexBuffer->Created: myVertexBuffer1->Created +=

gcnew System::EventHandler( this->OnCreateVertexBuffer1);

this->OnCreateVertexBuffer1(myVertexBuffer1, nullptr);

//Создаем буфер для 4-x вершин прямоугольника: myVertexBuffer2 = gcnew VertexBuffer(

typeid<CustomVertex::TransformedColored>, 4, myDev, Microsoft::DirectX::Direct3D::Usage::Points, CustomVertex::TransformedColored::Format, Pool::Default);

//Создаем геометрические данные при обработке

//события myVertexBuffer->Created: myVertexBuffer2->Created +=

gcnew System::EventHandler( this->OnCreateVertexBuffer2);

this->OnCreateVertexBuffer2(myVertexBuffer2, nullptr);

}

//Создаем массив вершин и их параметры для треугольника: public: static void OnCreateVertexBuffer1(Object^ sender, EventArgs^ e)

{

VertexBuffer^ myVertexBuffer1 = (VertexBuffer^)sender; //Создаем объект myGraphicsStream класса GraphicsStream //для потока графических данных:

GraphicsStream^ myGraphicsStream = myVertexBuffer1->

178 Жарков В.А. Компьютерная графика, мультимедиа и игры на Visual C++ 2005

Lock(0, 0, Microsoft::DirectX::Direct3D::LockFlags::Discard);

//Массив предопределенных пользовательских вершин

//(predefined custom vertex) в классе CustomVertex: array<CustomVertex::TransformedColored>^ Vertex1 =

gcnew array<CustomVertex::TransformedColored>(3); //В классе (структуре) Color создаем объект myColor: Color myColor = Color::FromArgb(0);

//Используем метод ToArgb

//для получения 32-bit ARGB-значение myColor: myColor = Color::FromArgb(myColor.ToArgb()); //Вершина 0:

//Координаты вершины:

Vertex1[0].X = 150; Vertex1[0].Y = 50;

Vertex1[0].Z = 0.5f; Vertex1[0].Rhw = 1; //Цвет вершины:

Vertex1[0].Color = myColor.Aqua.ToArgb(); //Вершина 1:

//Координаты вершины:

Vertex1[1].X = 250; Vertex1[1].Y = 300;

Vertex1[1].Z = 0.5f; Vertex1[1].Rhw = 1; //Цвет вершины:

Vertex1[1].Color = myColor.Black.ToArgb(); //Вершина 2:

//Координаты вершины:

Vertex1[2].X = 50; Vertex1[2].Y = 300;

Vertex1[2].Z = 0.5f; Vertex1[2].Rhw = 1; //Цвет вершины:

Vertex1[2].Color = myColor.LightPink.ToArgb(); //Записываем поток графических данных

//в объект myGraphicsStream: myGraphicsStream->Write(Vertex1); myVertexBuffer1->Unlock();

}

//Массив вершин и их параметры для прямоугольника: public: static void OnCreateVertexBuffer2(Object^ sender, EventArgs^ e)

{

VertexBuffer^ myVertexBuffer2 = (VertexBuffer^)sender; //Создаем объект myGraphicsStream класса GraphicsStream //для потока графических данных:

GraphicsStream^ myGraphicsStream = myVertexBuffer2-> Lock(0, 0, Microsoft::DirectX::Direct3D::LockFlags::Discard);

//Массив предопределенных пользовательских вершин

//(predefined custom vertex) в классе CustomVertex:

Глава 36. Методика проектирования плоских фигур

179

array<CustomVertex::TransformedColored>^ Vertex2 = gcnew array<CustomVertex::TransformedColored>(4);

//В классе (структуре) Color создаем объект myColor: Color myColor = Color::FromArgb(0);

//Используем метод ToArgb

//для получения 32-bit ARGB-значение myColor: myColor = Color::FromArgb(myColor.ToArgb()); //Вершина 0:

//Координаты вершины:

Vertex2[0].X = 300.0f; Vertex2[0].Y = 300.0f; Vertex2[0].Z = 0.5f; Vertex2[0].Rhw = 1; //Цвет вершины:

Vertex2[0].Color = myColor.Black.ToArgb(); //Вершина 1:

//Координаты вершины:

Vertex2[1].X = 300.0f; Vertex2[1].Y = 50.0f; Vertex2[1].Z = 0.5f; Vertex2[1].Rhw = 1; //Цвет вершины:

Vertex2[1].Color = myColor.White.ToArgb(); //Вершина 2:

//Координаты вершины:

Vertex2[2].X = 500.0f; Vertex2[2].Y = 300.0f; Vertex2[2].Z = 0.5f; Vertex2[2].Rhw = 1; //Цвет вершины:

Vertex2[2].Color = myColor.Blue.ToArgb(); //Вершина 3:

//Координаты вершины:

Vertex2[3].X = 500.0f; Vertex2[3].Y = 50.0f; Vertex2[3].Z = 0.5f; Vertex2[3].Rhw = 1; //Цвет вершины:

Vertex2[3].Color = myColor.Green.ToArgb(); //Записываем поток графических данных

//в объект myGraphicsStream: myGraphicsStream->Write(Vertex2); //Открываем буфер вершин: myVertexBuffer2->Unlock();

}

Листинг 36.6. Методы для визуализации преобразованных вершин фигуры.

//Объявляем и инициализируем глобальные переменные. //Для устройства myDevice класса Device:

static Device^ myDevice = nullptr; //Для буфера вершин VertexBuffer:

static VertexBuffer^ myVertexBuffer = nullptr; static PresentParameters^ myPresentParameters =

gcnew PresentParameters();

Соседние файлы в предмете Программирование на C++