Жарков В.А. - Visual C++ 2005, DirectX 9.0c и Microsoft Agent в компьютерной графике, мультимедиа и играх (Листинги книги) - 2005
.pdf170 Жарков В.А. Компьютерная графика, мультимедиа и игры на 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();