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

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

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

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

//выбран новый персонаж:

if (comboBox1->SelectedIndex == 0)

{

//Скрываем все другие персонажи: myMerlin->Hide(0); myPeedy->Hide(0); myRobby->Hide(0); //Останавливаем текущую анимацию: myGenie->StopAll(nullptr);

//От начала координат в вехнем левом углу Form1 //задаем координаты "x, y" _

//места расположения нового персонажа: myGenie->MoveTo(

Convert::ToInt16(this->Location.X + 750), Convert::ToInt16(this->Location.Y + 250), 0);

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

//Перед анимацией персонаж произносит "Слушаюсь": mySpeech = "Слушаюсь.";

myGenie->Speak(mySpeech, nullptr);

//Показываем выделенную нами анимацию персонажа: myGenie->Play(comboBox2->SelectedItem->ToString()); //Показываем анимацию персонажа в покое: myGenie->Play("RestPose");

}

//Если в окне со списком comboBox1 //выбран новый персонаж:

if (comboBox1->SelectedIndex == 1)

{

//Скрываем все другие персонажи: myGenie->Hide(0); myPeedy->Hide(0); myRobby->Hide(0);

//Останавливаем текущую анимацию: myMerlin->StopAll(nullptr);

//От начала координат в вехнем левом углу Form1 //задаем координаты "x, y" _

//места расположения нового персонажа: myMerlin->MoveTo(

Convert::ToInt16(this->Location.X + 750), Convert::ToInt16(this->Location.Y + 250), 0);

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

//Перед анимацией персонаж произносит "Слушаюсь": mySpeech = "Слушаюсь.";

myMerlin->Speak(mySpeech, nullptr);

//Показываем выделенную нами анимацию персонажа:

Глава 40. Вывод на экран выступлений и анимаций всех персонажей

221

myMerlin->Play(comboBox2->SelectedItem->ToString()); //Показываем анимацию персонажа в покое: myMerlin->Play("RestPose");

}

//Если в окне со списком comboBox1 //выбран новый персонаж:

if (comboBox1->SelectedIndex == 2)

{

//Скрываем все другие персонажи: myGenie->Hide(0); myMerlin->Hide(0); myRobby->Hide(0);

//Останавливаем текущую анимацию: myPeedy->StopAll(nullptr);

//От начала координат в вехнем левом углу Form1 //задаем координаты "x, y" _

//места расположения нового персонажа: myPeedy->MoveTo(

Convert::ToInt16(this->Location.X + 750), Convert::ToInt16(this->Location.Y + 250), 0);

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

//Перед анимацией персонаж произносит "Слушаюсь": mySpeech = "Слушаюсь.";

myPeedy->Speak(mySpeech, nullptr);

//Показываем выделенную нами анимацию персонажа: myPeedy->Play(comboBox2->SelectedItem->ToString()); //Показываем анимацию персонажа в покое: myPeedy->Play("RestPose");

}

//Если в окне со списком comboBox1 //выбран новый персонаж:

if (comboBox1->SelectedIndex == 3)

{

//Скрываем все другие персонажи: myGenie->Hide(0); myMerlin->Hide(0); myPeedy->Hide(0);

//Останавливаем текущую анимацию: myRobby->StopAll(nullptr);

//От начала координат в вехнем левом углу Form1 //задаем координаты "x, y" _

//места расположения нового персонажа: myRobby->MoveTo(

Convert::ToInt16(this->Location.X + 750), Convert::ToInt16(this->Location.Y + 250), 0);

//Показываем новый персонаж:

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

myRobby->Show(0);

//Перед анимацией персонаж произносит "Слушаюсь": mySpeech = "Слушаюсь.";

myRobby->Speak(mySpeech, nullptr);

//Показываем выделенную нами анимацию персонажа: myRobby->Play(comboBox2->SelectedItem->ToString()); //Показываем анимацию персонажа в покое: myRobby->Play("RestPose");

}

}

Теперь, следуя алгоритму в первом параграфе, мы записываем такой код, чтобы: если мы щелкнем кнопку на форме, но ничего не запишем в окно TextBox, то

персонаж попросит нас записать текст в это окно;

когда мы запишем в окно TextBox текст на русском языке и щелкнем кнопку на форме, то персонаж произнесет записанный нами текст.

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

Листинг 40.6. Метод для кнопки.

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

{

//Персонаж произносит текст из окна TextBox //при условии:

//Если окно TextBox не заполнено: if (textBox1->TextLength == 0)

{

if (comboBox1->SelectedIndex == 0)

{

//Останавливаем текущую анимацию: myGenie->StopAll(nullptr);

//Персонаж просит заполнить окно TextBox: mySpeech =

"Запишите, пожалуйста, в окно слова, " "которые я должен произнести.";

myGenie->Speak(mySpeech, nullptr);

}

if (comboBox1->SelectedIndex == 1)

{

//Останавливаем текущую анимацию: myMerlin->StopAll(nullptr);

//Персонаж просит заполнить окно TextBox: mySpeech =

Глава 40. Вывод на экран выступлений и анимаций всех персонажей

223

"Запишите, пожалуйста, в окно слова, " "которые я должен произнести.";

myMerlin->Speak(mySpeech, nullptr);

}

if (comboBox1->SelectedIndex == 2)

{

//Останавливаем текущую анимацию: myPeedy->StopAll(nullptr);

//Персонаж просит заполнить окно TextBox: mySpeech =

"Запишите, пожалуйста, в окно слова, " "которые я должен произнести.";

myPeedy->Speak(mySpeech, nullptr);

}

if (comboBox1->SelectedIndex == 3)

{

//Останавливаем текущую анимацию: myRobby->StopAll(nullptr);

//Персонаж просит заполнить окно TextBox: mySpeech =

"Запишите, пожалуйста, в окно слова, " "которые я должен произнести.";

myRobby->Speak(mySpeech, nullptr);

}

}

else

//иначе, если окно TextBox заполнено, //персонаж произносит слова из этого TextBox:

{

//Считываем текст из окна TextBox: mySpeech = textBox1->Text;

if (comboBox1->SelectedIndex == 0)

{

//Останавливаем текущую анимацию: myGenie->StopAll(nullptr);

//Персонаж произносит слова из TextBox: myGenie->Speak(mySpeech, nullptr);

}

if (comboBox1->SelectedIndex == 1)

{

//Останавливаем текущую анимацию: myMerlin->StopAll(nullptr);

//Персонаж произносит слова из TextBox: myMerlin->Speak(mySpeech, nullptr);

}

if (comboBox1->SelectedIndex == 2)

{

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

//Останавливаем текущую анимацию: myPeedy->StopAll(nullptr);

//Персонаж произносит слова из TextBox: myPeedy->Speak(mySpeech, nullptr);

}

if (comboBox1->SelectedIndex == 3)

{

//Останавливаем текущую анимацию: myRobby->StopAll(nullptr);

//Персонаж произносит слова из TextBox: myRobby->Speak(mySpeech, nullptr);

}

}

}

В предыдущей главе мы привели методику и программу для управления персонажами при помощи наших голосовых команд: когда мы произнесем в микрофон поанглийски: заданную по умолчанию команду Hide (Скрыть), персонаж удаляется с экрана; одно из заданных по умолчанию имен персонажей (Genie, Merlin, Peedy, Robby), этот озвученный персонаж сменяет предыдущий; заданную нами пользовательскую голосовую команду, например, MoveToMouse, персонаж перемещается в место нахождения курсора мыши.

По изложенной в предыдущей главе методике здесь мы продолжим разработку методов управления персонажами при помощи голосовых команд. Напомним, что на листинге 40.2 в метод Form1_Load мы добавили новую голосовую команду в виде имени анимации (это имя имеется в окне со списком сomboBox2 для любого персонажа), чтобы видимый на экране персонаж произнес поясняющий текст и выполнил эту анимацию. К примеру, на листинге 40.2 для персонажа Genie (Джин) мы добавили имя анимации Announce в следующем коде:

//Добавляем анимацию Announce, активизируемую голосом: mySpeech = "Announce";

myGenie->Commands->Add(

mySpeech, mySpeech, mySpeech, nullptr, nullptr);

Таким образом, чтобы после произнесения в микрофон имени анимации Announce персонаж выполнил эту анимацию, в панели Properties выбираем заголовок AxAgent1 (или щелкаем по элементу управления AxAgent1) и на вкладке Events дважды щелкаем по имени события Command. Появляется файл Form1.h с шаблоном, который после записи нашего кода (согласно алгоритму) принимает такой вид.

Листинг 40.7. Метод, чтобы персонаж выполнял наши голосовые команды.

private:

System::Void axAgent1_Command(System::Object^ sender, AxAgentObjects::_AgentEvents_CommandEvent^ e)

{

//Определяем объект myCommand //интерфейса IAgentCtlUserInput:

Глава 40. Вывод на экран выступлений и анимаций всех персонажей

225

AgentObjects::IAgentCtlUserInput^ myCommand;

//Связываем объект myCommand с голосом пользователя: myCommand = static_cast<AgentObjects::

IAgentCtlUserInput^>(e->userInput);

//Если выше при помощи метода Add мы добавили //имя анимации, например, Announce

//в качестве голосовой команды:

if (0==myCommand->Name->CompareTo("Announce"))

{

//После голосовой команды останавливаем //текущую анимацию: myGenie->StopAll(nullptr);

//Перед анимацией персонаж произносит: mySpeech = "Охотно покажу эту анимацию."; myGenie->Speak(mySpeech, nullptr); //Показывает анимацию, имя которой //мы произнесли в микрофон: myGenie->Play("Announce");

//Показывает анимацию в покое: myGenie->Play("RestPose");

}

//После команды голосом "MoveToMouse" //персонаж перемещается на место курсора мыши:

if (0==myCommand->Name->CompareTo("MoveToMouse"))

{

myGenie->MoveTo(Cursor->Position.X, Cursor->Position.Y, 1000);

}

}

Глава 41. Методика создания компьютерных игр и мультфильмов

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

//Объявляем член myGenie интерфейса IAgentCtlCharacterEx //и формат файла для персонажа по имени Джин:

static AgentObjects::IAgentCtlCharacterEx^ myGenie; static String^ DATAPATH_1 = "Genie.acs";

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

Листинг 41.2. Загрузка персонажа, его речей и анимаций.

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

{

//Загружаем персонаж

//в элемент управления axAgent: axAgent1->Characters->Load("Genie", DATAPATH_1); myGenie = axAgent1->Characters->Character("Genie");

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

Convert::ToInt16(this->Location.X + 250), Convert::ToInt16(this->Location.Y + 100), 0);

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

//Персонаж выполняет анимацию Announce: myGenie->Play("Announce");

//Произносит записанную нами речь: mySpeech =

"Здравствуйте, меня зовут Джин. " "Спасибо за Ваше внимание ко мне.";

myGenie->Speak(mySpeech, nullptr);

//Выполняет анимацию GestureRight:

Глава 41. Методика создания компьютерных игр и мультфильмов

227

myGenie->Play("GestureRight");

//Произносит речь:

mySpeech = "Попросите меня сказать " "текст из этого окна...";

myGenie->Speak(mySpeech, nullptr);

//Перемещается к переключателям с именами анимаций //за заданное нами время, равное, //например, 15000 мс (или 15 с.): myGenie->MoveTo(

Convert::ToInt16(this->Location.X + 540), Convert::ToInt16(this->Location.Y + 300), 15000);

//Выполняет анимацию GestureRight: myGenie->Play("GestureRight");

//Произносит записанную нами речь: mySpeech = "... или выберите, пожалуйста, "

"вид моей анимации.."; myGenie->Speak(mySpeech, nullptr);

}

Теперь, следуя алгоритму в первом параграфе, мы записываем такой код, чтобы: если мы щелкнем кнопку на форме, но ничего не запишем в окно TextBox, то

персонаж попросит нас записать текст в это окно;

когда мы запишем в окно TextBox текст на русском языке и щелкнем кнопку на форме, то персонаж произнесет по-русски записанный нами текст.

Дважды щелкаем эту кнопку в режиме редактирования (или в панели Properties с заголовком button1 на вкладке Events дважды щелкаем по имени события Click).

Появляется файл Form1.h с шаблоном (метода button1_Click), который после записи нашего кода принимает следующий вид.

Листинг 41.3. Метод для кнопки.

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

{

//Персонаж произносит текст из окна TextBox //при условии:

//Если окно TextBox не заполнено: if (textBox1->TextLength == 0)

{

mySpeech =

"Запишите, пожалуйста, в окно слова, " "которые я должен произнести.";

myGenie->Speak(mySpeech, nullptr);

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

}

else

//иначе, если окно TextBox заполнено, //персонаж произносит слова из этого TextBox:

{

mySpeech = textBox1->Text; myGenie->Speak(mySpeech, nullptr);

}

}

Записываем код, чтобы после нашего щелчка мышью (или после нажатий двух клавиш, например, для первого переключателя: Alt+1) по первому переключателю с именем анимации Announce, персонаж:

произносил речь; показывал выбранную нами анимацию.

Для этого дважды щелкаем первый переключатель в режиме редактирования (или в панели Properties с заголовком radioButton1 на вкладке Events дважды щелкаем по имени события CheckedChanged).

Появляется файл Form1.h с шаблоном (метода radioButton1_CheckedChanged), который после записи нашего кода принимает такой вид.

Листинг 41.4. Метод для переключателя.

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

{

//Останавливаем все предыдущие действия персонажа: myGenie->StopAll(nullptr);

//Перед анимацией персонаж произносит фразу: mySpeech = "Охотно выполняю эту анимацию."; myGenie->Speak(mySpeech, nullptr);

//Показываем выбранную нами анимацию персонажа: myGenie->Play("Announce");

//Показываем анимацию персонажа в покое: myGenie->Play("RestPose");

}

Аналогично последовательно дважды щелкаем по каждому последующему переключателю в режиме редактирования и в каждый шаблон метода записываем такой же (как на предыдущем листинге) код, только строку с именем предыдущей анимации заменяем на соответствующую строку из следующих девяти строк (по числу оставшихся переключателей) с именами новой анимации:

myGenie->Play("Congratulate"); myGenie->Play("Congratulate_2"); myGenie->Play("DontRecognize");

Глава 41. Методика создания компьютерных игр и мультфильмов

229

myGenie->Play("Explain"); myGenie->Play("GetAttention"); myGenie->Play("Suggest"); myGenie->Play("Surprised"); myGenie->Play("Wave"); myGenie->Play("Write");

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