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

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

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

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

static VertexBuffer^ myVertexBuffer = nullptr; //Объявляем и инициализируем объект myTexture //класса Texture:

static Texture^ myTexture = nullptr;

static PresentParameters^ myPresentParameters = gcnew PresentParameters();

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

{

try

{

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

SwapEffect::Discard; myPresentParameters->EnableAutoDepthStencil = true; myPresentParameters->AutoDepthStencilFormat =

DepthFormat::D16;

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

this, CreateFlags::SoftwareVertexProcessing, myPresentParameters);

myDevice->DeviceReset +=

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

myPause = false; return true;

}

catch (DirectXException^)

{

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

}

}

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

public: void myRendering()

{

if (myPause) return;

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

Clear(ClearFlags::Target | ClearFlags::ZBuffer, System::Drawing::Color::White, 1.0f, 0);

//Начинаем сцену:

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

201

myDevice->BeginScene();

//Используем матрицы для выполнения преобразований: SetupMatrices();

//Устанавливаем нашу текстуру: myDevice->SetTexture(0, myTexture); myDevice->TextureState[0]->ColorOperation =

TextureOperation::Modulate; myDevice->TextureState[0]->ColorArgument1 =

TextureArgument::TextureColor; myDevice->TextureState[0]->ColorArgument2 =

TextureArgument::Diffuse; myDevice->TextureState[0]->AlphaOperation =

TextureOperation::Disable; //Рисуем фигуру:

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

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

PrimitiveType::TriangleStrip, 0, (4 * 25) - 2); //Заканчиваем сцену:

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

}

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

{

Device^ myDev = (Device^)sender; //Создаем буфер для вершин фигуры: myVertexBuffer = gcnew VertexBuffer(

typeid<CustomVertex::PositionNormalTextured>, 100, myDev, Microsoft::DirectX::Direct3D::Usage::WriteOnly, CustomVertex::PositionNormalTextured::Format, Pool::Default);

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

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

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

this->OnCreateVertexBuffer(myVertexBuffer, nullptr);

}

//Настраиваем параметры устройства для рисования: public: static void OnResetDevice(Object^ sender, EventArgs^ e)

{

Device^ myDev = (Device^)sender;

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

//Выключаем режим CullMode, чтобы мы видели //переднюю и заднюю поверхности фигуры: myDev->RenderState->CullMode = Cull::None; //Выключаем трехмерное освещение: myDev->RenderState->Lighting = false;

//Для рисования трехмерной фигуры включаем Z - буфер: myDevice->RenderState->ZBufferEnable = true; //Загружаем в проект наш рисунок Texture_1: myTexture = TextureLoader::FromFile(myDev,

"D:\\MyDocs\\Texture_1.bmp");

}

//Массив параметров вершин. Строим фигуру в буфере вершин: public: static void OnCreateVertexBuffer(

Object^ sender, EventArgs^ e)

{

//Для фигуры с любым количеством вершин //объявляем массив и выполняем преобразование типов:

array<CustomVertex::PositionNormalTextured>^ Vertex = (array<CustomVertex::PositionNormalTextured>^) myVertexBuffer->Lock(0, Microsoft::DirectX::Direct3D::LockFlags::None);

//В классе (структуре) PositionNormal

//создаем массив из 100 пользовательских вершин: for (int i = 0; i < 50; i++)

{

//Заполняем вершины данными.

//Задаем размеры вращающегося цилиндра: float zoom1 = -1.5;

float zoom2 = 1.5;

float theta = (float)(2 * Math::PI * i) / 49; //Рассчитываем координаты (Position) и //нормали (Normal) вершин:

Vertex[2 * i].Position = Vector3((float)Math::Sin(theta), zoom1, (float)Math::Cos(theta));

Vertex[2 * i].Normal = Vector3((float)Math::Sin(theta), 0, (float)Math::Cos(theta));

//Добавляем в вершину u-компоненту текстуры: Vertex[2 * i].Tu = ((float)i) / (50 - 1); //Добавляем в вершину v-компоненту текстуры: Vertex[2 * i].Tv = 1.0f;

//Рассчитываем координаты (Position) и //нормали (Normal) вершин:

Vertex[2 * i + 1].Position = Vector3((float)Math::Sin(theta), zoom2, (float)Math::Cos(theta));

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

203

Vertex[2 * i + 1].Normal = Vector3((float)Math::Sin(theta), 0, (float)Math::Cos(theta));

//Добавляем в вершину u-компоненту текстуры: Vertex[2 * i + 1].Tu = ((float)i) / (50 - 1); //Добавляем в вершину v-компоненту текстуры: Vertex[2 * i + 1].Tv = 0.0f;

}

//Открываем буфер вершин: myVertexBuffer->Unlock();

}

//Включаем таймер и выполняем матричные преобразования: private: void SetupMatrices()

{

//Используем глобальную матрицу (world matrix), //чтобы вращать фигуру вокруг оси y: myDevice->Transform->World = Matrix::RotationAxis(

Vector3(

(float)Math::Cos(Environment::TickCount / 250.0f), 1,

(float)Math::Sin(Environment::TickCount / 250.0f)), Environment::TickCount / 1000.0f);

//Задаем координаты глаза наблюдателя

//в матрице вида (view matrix): myDevice->Transform->View = Matrix::LookAtLH(

Vector3(0.0f, 3.0f, -5.0f),

Vector3(0.0f, 0.0f, 0.0f),

Vector3(0.0f, 1.0f, 0.0f));

//При помощи матрицы проецирования (projection matrix) //выполняем перспективные преобразования: myDevice->Transform->Projection =

Matrix::PerspectiveFovLH( (float)Math::PI / 4, 1.0f, 1.0f, 100.0f);

}

Часть VII. Методология разработки мультимедиа и игр на основе Microsoft Agent

Глава 38. Загрузка и установка компонен-

тов Microsoft Agent

Продолжаем разрабатывать методологию мультимедиа на примере интеграции Visual Basic с очень популярной и перспективной технологией Microsoft Agent. Microsoft Agent – это беспрецедентная программная мультимедийная технология для более естественных путей связи человека и компьютера через создание новых диалоговых интерфейсов. Это набор программных услуг, которые дают возможность разработчикам включать интерактивные анимированные персонажи в их приложения и веб-страницы. Эти персонажи могут говорить при помощи программы (средства, механизма, инструмента, преобразователя) для перевода текста в речь (a text-to-speech engine - TTS), воспроизводить аудио и даже принимать разговорные речевые коман-

ды через механизм распознавания речи (speech recognition engine). Microsoft Agent

дает возможность разработчикам расширить интерфейс пользователя за пределы распространенных сегодня взаимодействий мыши и клавиатуры. Технология Microsoft Agent может быть применима в следующих областях:

имеется огромное число ролей, которые разработчик в качестве режиссера может создать для персонажей Microsoft Agent и применить в своих программах;

при помощи этих персонажей главный компьютер провайдера может приветствовать новых пользователей и снабдить их показом времени, сообщением о том, что компьютер включен, приложение выполнено или веб-узел просмотрен;

дружественная обучающая программа с такими персонажами могла бы помогать человеку в поэтапном освоении нового материала;

персонаж мог бы представить уведомление или предупреждение, что новая электронная почта прибыла, и затем предложить ее прочитать;

такой помощник мог бы выполнить поиск информации в Интернете, а затем прочитать найденную информацию вслух.

Технология Microsoft Agent предназначена прежде всего для разработчиков, использующих языки или среды, которые поддерживают компонентную объектную модель (Component Object Model – COM) или интерфейсы управления Microsoft ActiveX. Они включают, например, Microsoft Visual Studio (Visual C++, Visual Basic, Visual FoxPro), Microsoft Office (Visual Basic for Applications), Microsoft Internet Explorer (Visual Basic Scripting Edition or Microsoft Jscript), Microsoft Windows Script Host (ActiveX Scripting Language).

Глава 39. Методика управления мультипликационными персонажами

Листинг 39.1. Объявление членов интерфейса и глобальных переменных.

//Объявляем персонаж Джина (Genie) и путь к его файлу: static AgentObjects::IAgentCtlCharacterEx^ myGenie; static String^ DATAPATH_1 = "Genie.acs";

//Объявляем персонаж Мага (Merlin) и путь к его файлу: static AgentObjects::IAgentCtlCharacterEx^ myMerlin; static String^ DATAPATH_2 = "Merlin.acs";

//Объявляем персонаж Попугая (Peedy) и путь к его файлу: static AgentObjects::IAgentCtlCharacterEx^ myPeedy; static String^ DATAPATH_3 = "Peedy.acs";

//Объявляем персонаж Робота (Robby) и путь к его файлу: static AgentObjects::IAgentCtlCharacterEx^ myRobby; static String^ DATAPATH_4 = "Robby.acs";

//Глобальная переменная для любого текста персонажа: static String^ mySpeech;

А в шаблон (метода Form1_Load) записываем наш код (согласно постановке задачи для всех персонажей), и метод Form1_Load принимает такой вид.

Листинг 39.2. Загрузка персонажей в элементы управления.

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

{

//Загружаем персонаж в элемент управления axAgent: axAgent1->Characters->Load("Genie", DATAPATH_1); myGenie = axAgent1->Characters->Character("Genie"); //Чтобы он выполнял голосовые команды на англ. яз.: myGenie->LanguageID = 0x409;

//Записываем текст речи персонажа в окно TextBox: textBox1->Text = "Здравствуйте. Меня зовут Джин.";

//Загружаем персонаж в элемент управления axAgent: axAgent2->Characters->Load("Merlin", DATAPATH_2); myMerlin = axAgent2->Characters->Character("Merlin"); //Чтобы он выполнял голосовые команды на англ. яз.: myMerlin->LanguageID = 0x409;

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

//Записываем текст речи персонажа в окно TextBox: textBox2->Text = "Здравствуйте. Меня зовут Маг.";

//Загружаем персонаж в элемент управления axAgent: axAgent3->Characters->Load("Peedy", DATAPATH_3); myPeedy = axAgent3->Characters->Character("Peedy"); //Чтобы он выполнял голосовые команды на англ. яз.: myPeedy->LanguageID = 0x409;

//Записываем текст речи персонажа в окно TextBox: textBox3->Text = "Здравствуйте. Меня зовут Попугай.";

//Загружаем персонаж в элемент управления axAgent: axAgent4->Characters->Load("Robby", DATAPATH_4); myRobby = axAgent4->Characters->Character("Robby"); //Чтобы он выполнял голосовые команды на англ. яз.: myRobby->LanguageID = 0x409;

//Записываем текст речи персонажа в окно TextBox: textBox4->Text = "Здравствуйте. Меня зовут Робот."; //Для всех четырех персонажей добавляем //нашу голосовую команду, как пользователей, //например, команду "MoveToMouse" - //переместиться на место курсора мыши:

mySpeech = "MoveToMouse"; myGenie->Commands->Add(

mySpeech, mySpeech, mySpeech, nullptr, nullptr); myMerlin->Commands->Add(

mySpeech, mySpeech, mySpeech, nullptr, nullptr); myPeedy->Commands->Add(

mySpeech, mySpeech, mySpeech, nullptr, nullptr); myRobby->Commands->Add(

mySpeech, mySpeech, mySpeech, nullptr, nullptr); //Задаем, например, Джину выполнение еще команды, //для примера, голосовой команды "Merlin":

mySpeech = "Merlin"; myGenie->Commands->Add(

mySpeech, mySpeech, mySpeech, nullptr, nullptr); //Задаем, например, Магу выполнение еще команды, //для примера, голосовой команды "Peedy":

mySpeech = "Peedy"; myMerlin->Commands->Add(

mySpeech, mySpeech, mySpeech, nullptr, nullptr); //Задаем, например, Попугаю выполнение еще команды, //для примера, голосовой команды "Robby":

mySpeech = "Robby"; myPeedy->Commands->Add(

mySpeech, mySpeech, mySpeech, nullptr, nullptr); //Задаем, например, Роботу выполнение еще команды,

Глава 39. Методика управления мультипликационными персонажами

207

//для примера, голосовой команды "Genie": mySpeech = "Genie"; myRobby->Commands->Add(

mySpeech, mySpeech, mySpeech, nullptr, nullptr);

}

Чтобы записать нашу часть кода для показа на экране монитора первого персонажа Genie (Джин) после щелчка первой кнопки “Показать Джина” на форме Form1 (рис. 39.5) дважды щелкаем эту кнопку в режиме редактирования (или в панели Properties выбираем заголовок button1 и на вкладке Events дважды щелкаем по имени события Click). Появляется файл Form1.h с шаблоном (метода button1_Click), который после записи нашего кода (согласно постановке задачи для первого персонажа) принимает следующий вид.

Листинг 39.3. Метод для кнопки “Показать Джина”.

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

{

//От начала координат в вехнем левом углу Form1 //задаем координаты "x,y" места расположения персонажа: myGenie->MoveTo(

Convert::ToInt16(this->Location.X + 400), Convert::ToInt16(this->Location.Y - 130), 1000);

//Показать персонаж в заданном месте: myGenie->Show(0);

//Персонаж произносит текст из окна TextBox //и показывает этот текст в виде подсказки: myGenie->Speak(textBox1->Text, nullptr);

}

Чтобы удалить персонаж с экрана монитора после щелчка второй кнопки “Скрыть Джина ” на форме Form1 (рис. 39.5), дважды щелкаем эту кнопку в режиме редактирования. Появляется файл Form1.h с шаблоном (метода button2_Click), который после записи нашего кода принимает такой вид.

Листинг 39.4. Метод для кнопки “Скрыть Джина”.

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

{

//Скрыть персонаж: myGenie->Hide(0);

}

Аналогично, чтобы записать нашу часть кода для показа на экране монитора второго персонажа Merlin (Маг) при помощи кнопки “Показать Мага” на форме Form1 (рис. 39.5), дважды щелкаем эту кнопку. Появляется файл Form1.h с шаблоном (метода button3_Click), который после записи нашего кода принимает такой вид.

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

Листинг 39.5. Метод для кнопки “Показать Мага”.

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

{

//От начала координат в вехнем левом углу Form1 //задаем координаты "x,y" места расположения персонажа: myMerlin->MoveTo(

Convert::ToInt16(this->Location.X + 400), Convert::ToInt16(this->Location.Y - 130), 1000);

//Показать персонаж в заданном месте: myMerlin->Show(0);

//Персонаж произносит текст из окна TextBox //и показывает этот текст в виде подсказки: myMerlin->Speak(textBox2->Text, nullptr);

}

Чтобы удалить персонаж с экрана монитора при помощи кнопки “Скрыть Мага” на форме Form1 (рис. 39.5), дважды щелкаем эту кнопку в режиме редактирования. Появляется файл Form1.h с шаблоном (метода button4_Click), который после записи нашего кода принимает такой вид.

Листинг 39.6. Метод для кнопки “Скрыть Мага”.

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

{

//Скрыть персонаж: myMerlin->Hide(0);

}

Аналогично, чтобы записать нашу часть кода для показа на экране монитора третьего персонажа Peedy (Попугай) при помощи кнопки “Показать Попугая” на форме Form1 (рис. 39.5), дважды щелкаем эту кнопку в режиме редактирования. Появляется файл Form1.h с шаблоном (метода button5_Click), который после записи нашего кода принимает такой вид.

Листинг 39.7. Метод для кнопки “Показать Попугая”.

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

{

//От начала координат в вехнем левом углу Form1 //задаем координаты "x,y" места расположения персонажа: myPeedy->MoveTo(

Convert::ToInt16(this->Location.X + 400), Convert::ToInt16(this->Location.Y - 130), 1000);

Глава 39. Методика управления мультипликационными персонажами

209

//Показать персонаж в заданном месте: myPeedy->Show(0);

//Персонаж произносит текст из окна TextBox //и показывает этот текст в виде подсказки: myPeedy->Speak(textBox3->Text, nullptr);

}

Чтобы удалить персонаж с экрана монитора при помощи кнопки “Скрыть Попугая ” на форме Form1 (рис. 39.5), дважды щелкаем эту кнопку в режиме редактирования. Появляется файл Form1.h с шаблоном (метода button6_Click), который после записи нашего кода принимает такой вид.

Листинг 39.8. Метод для кнопки “Скрыть Попугая”.

private:

System::Void button6_Click(System::Object^ sender, System::EventArgs^ e)

{

//Скрыть персонаж: myPeedy->Hide(0);

}

Аналогично, чтобы записать нашу часть кода для показа на экране монитора последнего четвертого персонажа Robby (Робот) при помощи кнопки “Показать Робота” на форме Form1 (рис. 39.5), дважды щелкаем эту кнопку в режиме редактирования. Появляется файл Form1.h с шаблоном (метода button7_Click), который после записи нашего кода принимает такой вид.

Листинг 39.9. Метод для кнопки “Показать Робота”.

private:

System::Void button7_Click(System::Object^ sender, System::EventArgs^ e)

{

//От начала координат в вехнем левом углу Form1 //задаем координаты "x,y" места расположения персонажа: myRobby->MoveTo(

Convert::ToInt16(this->Location.X + 400), Convert::ToInt16(this->Location.Y - 130), 1000);

//Показать персонаж в заданном месте: myRobby->Show(0);

//Персонаж произносит текст из окна TextBox //и показывает этот текст в виде подсказки: myRobby->Speak(textBox4->Text, nullptr);

}

Чтобы удалить персонаж с экрана монитора при помощи кнопки “Скрыть Робота ” на форме Form1 (рис. 39.5), дважды щелкаем эту кнопку в режиме редактирования. Появляется файл Form1.h с шаблоном (метода button8_Click), который после

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