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