Методика управления мультипликационными персонажами
Листинг 47.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";
//Объявляем член интерфейса Agent:
private AgentObjects.Agent myAgentController;
//Глобальная переменная для любого текста персонажа:
static String mySpeech;
А в шаблон (метода Form1_Load) записываем наш код (согласно постановке задачи для всех персонажей), и метод Form1_Load принимает такой вид.
Листинг 47.2. Загрузка персонажей в элементы управления.
private void Form1_Load(object sender, EventArgs e)
{
//Загружаем персонаж в элемент управления axAgent1:
axAgent1.Characters.Load("Genie", DATAPATH_1);
myGenie = axAgent1.Characters.Character("Genie");
//Чтобы он выполнял голосовые команды на англ. яз.:
myGenie.LanguageID = 0x409;
//Записываем текст речи персонажа в окно TextBox:
textBox1.Text = "Здравствуйте. Меня зовут Джин.";
//Загружаем персонаж в элемент управления axAgent2:
axAgent2.Characters.Load("Merlin", DATAPATH_2);
myMerlin = axAgent2.Characters.Character("Merlin");
//Чтобы он выполнял голосовые команды на англ. яз.:
myMerlin.LanguageID = 0x409;
//Записываем текст речи персонажа в окно TextBox:
textBox2.Text = "Здравствуйте. Меня зовут Маг.";
//Загружаем персонаж в элемент управления axAgent3:
axAgent3.Characters.Load("Peedy", DATAPATH_3);
myPeedy = axAgent3.Characters.Character("Peedy");
// Чтобы он выполнял голосовые команды на англ. яз.:
myPeedy.LanguageID = 0x409;
//Записываем текст речи персонажа в окно TextBox:
textBox3.Text = "Здравствуйте. Меня зовут Попугай.";
//Загружаем персонаж в элемент управления axAgent4:
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, true, true);
myMerlin.Commands.Add(
mySpeech, mySpeech, mySpeech, true, true);
myPeedy.Commands.Add(
mySpeech, mySpeech, mySpeech, true, true);
myRobby.Commands.Add(
mySpeech, mySpeech, mySpeech, true, true);
//Задаем, например, Джину выполнение еще команды,
//для примера, голосовой команды "Merlin":
mySpeech = "Merlin";
myGenie.Commands.Add(
mySpeech, mySpeech, mySpeech, true, true);
//Задаем, например, Магу выполнение еще команды,
//для примера, голосовой команды "Peedy":
mySpeech = "Peedy";
myMerlin.Commands.Add(
mySpeech, mySpeech, mySpeech, true, true);
//Задаем, например, Попугаю выполнение еще команды,
//для примера, голосовой команды "Robby":
mySpeech = "Robby";
myPeedy.Commands.Add(
mySpeech, mySpeech, mySpeech, true, true);
//Задаем, например, Роботу выполнение еще команды,
//для примера, голосовой команды "Genie":
mySpeech = "Genie";
myRobby.Commands.Add(
mySpeech, mySpeech, mySpeech, true, true);
}
Чтобы записать нашу часть кода для показа на экране монитора первого персонажа Genie (Джин) при помощи первой кнопки “Показать Джина” на Form1 (рис. 47.5), дважды щелкаем эту кнопку в режиме редактирования (или в панели Properties выбираем заголовок button1 и на вкладке Events дважды щелкаем по имени события Click). Появляется файл Form1.h с шаблоном (метода button1_Click), который после записи нашего кода (согласно постановке задачи для первого персонажа) принимает следующий вид.
Листинг 47.3. Метод для кнопки “Показать Джина”.
//Объявляем общую для персонажей объектную переменную:
Object myObject = null;
private void button1_Click(object sender, EventArgs e)
{
//От начала координат в вехнем левом углу Form1
//задаем координаты "x,y" места расположения персонажа:
myGenie.MoveTo(
Convert.ToInt16(this.Location.X + 400),
Convert.ToInt16(this.Location.Y - 130), 1000);
//Показать персонаж в заданном месте:
myGenie.Show(0);
//Чтобы персонаж произносил речь через динамики,
//задаем ему следующие свойства:
myAgentController = new AgentObjects.Agent();
myAgentController.Connected = true;
myAgentController.Characters.Load(
"genie", "genie.acs");
myGenie =
myAgentController.Characters.Character("genie");
//Персонаж произносит текст из окна TextBox
//и показывает этот текст в виде подсказки:
myGenie.Speak(textBox1.Text, myObject);
}
Отметим, что в этом коде и далее число 1000 означает время (в миллисекундах) выполнения персонажем нашей команды в коде; это время, естественно, мы можем изменять.
Чтобы удалить персонаж с экрана монитора при помощи второй кнопки “Скрыть Джина ” на Form1 (рис. 47.5), дважды щелкаем эту кнопку в режиме редактирования. Появляется файл Form1.h с шаблоном (метода button2_Click), который после записи нашего кода принимает такой вид.
Листинг 47.4. Метод для кнопки “Скрыть Джина”.
private void button2_Click(object sender, EventArgs e)
{
//Скрыть персонаж:
myGenie.Hide(0);
}
Аналогично, чтобы записать нашу часть кода для показа на экране монитора второго персонажа Merlin (Маг) при помощи кнопки “Показать Мага” на Form1 (рис. 47.5), дважды щелкаем эту кнопку в режиме редактирования. Появляется файл Form1.h с шаблоном (функции button3_Click), который после записи нашего кода принимает следующий вид.
Листинг 47.5. Метод для кнопки “Показать Мага”.
private void button3_Click(object sender, EventArgs e)
{
//От начала координат в вехнем левом углу Form1
//задаем координаты "x,y" места расположения персонажа:
myMerlin.MoveTo(
Convert.ToInt16(this.Location.X + 400),
Convert.ToInt16(this.Location.Y - 130), 1000);
//Показать персонаж в заданном месте:
myMerlin.Show(0);
//Чтобы персонаж произносил речь через динамики,
//задаем ему следующие свойства:
myAgentController = new AgentObjects.Agent();
myAgentController.Connected = true;
myAgentController.Characters.Load(
"merlin", "merlin.acs");
myMerlin =
myAgentController.Characters.Character("merlin");
//Персонаж произносит текст из окна TextBox
//и показывает этот текст в виде подсказки:
myMerlin.Speak(textBox2.Text, myObject);
}
Чтобы удалить персонаж с экрана монитора при помощи кнопки “Скрыть Мага” на Form1 (рис. 47.5), дважды щелкаем эту кнопку в режиме редактирования. Появляется файл Form1.h с шаблоном (функции button4_Click), который после записи нашего кода принимает такой вид.
Листинг 47.6. Метод для кнопки “Скрыть Мага”.
private void button4_Click(object sender, EventArgs e)
{
//Скрыть персонаж:
myMerlin.Hide(0);
}
Аналогично, чтобы записать нашу часть кода для показа на экране монитора третьего персонажа Peedy (Попугай) при помощи кнопки “Показать Попугая” на Form1 (рис. 47.5), дважды щелкаем эту кнопку в режиме редактирования. Появляется файл Form1.h с шаблоном (функции button5_Click), который после записи нашего кода принимает такой вид.
Листинг 47.7. Метод для кнопки “Показать Попугая”.
private void button5_Click(object sender, EventArgs e)
{
//От начала координат в вехнем левом углу Form1
//задаем координаты "x,y" места расположения персонажа:
myPeedy.MoveTo(
Convert.ToInt16(this.Location.X + 400),
Convert.ToInt16(this.Location.Y - 130), 1000);
//Показать персонаж в заданном месте:
myPeedy.Show(0);
// Чтобы персонаж произносил речь через динамики,
//задаем ему следующие свойства:
myAgentController = new AgentObjects.Agent();
myAgentController.Connected = true;
myAgentController.Characters.Load(
"peedy", "peedy.acs");
myPeedy =
myAgentController.Characters.Character("peedy");
//Персонаж произносит текст из окна TextBox
//и показывает этот текст в виде подсказки:
myPeedy.Speak(textBox3.Text, myObject);
}
Чтобы удалить персонаж с экрана монитора при помощи кнопки “Скрыть Попугая ” на Form1 (рис. 47.5), дважды щелкаем эту кнопку в режиме редактирования. Появляется файл Form1.h с шаблоном (метода button6_Click), который после записи нашего кода принимает такой вид.
Листинг 47.8. Метод для кнопки “Скрыть Попугая”.
private void button6_Click(object sender, EventArgs e)
{
//Скрыть персонаж:
myPeedy.Hide(0);
}
Аналогично, чтобы записать нашу часть кода для показа на экране монитора последнего четвертого персонажа Robby (Робот) при помощи кнопки “Показать Робота” на Form1 (рис. 47.5), дважды щелкаем эту кнопку в режиме редактирования. Появляется файл Form1.h с шаблоном (метода button7_Click), который после записи нашего кода принимает такой вид.
Листинг 47.9. Метод для кнопки “Показать Робота”.
private void button7_Click(object sender, EventArgs e)
{
//От начала координат в вехнем левом углу Form1
//задаем координаты "x,y" места расположения персонажа:
myRobby.MoveTo(
Convert.ToInt16(this.Location.X + 400),
Convert.ToInt16(this.Location.Y - 130), 1000);
//Показать персонаж в заданном месте:
myRobby.Show(0);
// Чтобы персонаж произносил речь через динамики,
//задаем ему следующие свойства:
myAgentController = new AgentObjects.Agent();
myAgentController.Connected = true;
myAgentController.Characters.Load(
"robby", "robby.acs");
myRobby =
myAgentController.Characters.Character("robby");
//Персонаж произносит текст из окна TextBox
//и показывает этот текст в виде подсказки:
myRobby.Speak(textBox4.Text, myObject);
}
Чтобы удалить персонаж с экрана монитора при помощи кнопки “Скрыть Робота ” на Form1 (рис. 47.5), дважды щелкаем эту кнопку в режиме редактирования. Появляется файл Form1.h с шаблоном (метода button8_Click), который после записи нашего кода принимает такой вид.
Листинг 47.10. Метод для кнопки “Скрыть Робота”.
private void button2_Click(object sender, EventArgs e)
{
//Скрыть персонаж:
myRobby.Hide(0);
}
Теперь, следуя алгоритму в первом параграфе, мы записываем такой код, чтобы после нашего щелчка мышью по любому персонажу, этот персонаж:
1) выполнял анимацию, например, Confused (Смущенный);
2) произносил текст, например, такой: Есть проблемы?;
3) выполнял заключительную анимацию, например, в виде расслабленной позы отдыха RestPose. Для этого в панели Properties выбираем заголовок axAgent1 и на вкладке Events дважды щелкаем по имени события ClickEvent (рис. 47.10).
Появляется файл Form1.cs с шаблоном (метода axAgent1_ClickEvent), который после записи нашего кода (согласно алгоритму) принимает вид листинга 47.11. Аналогично в панели Properties последовательно выбираем заголовки для других элементов управления (axAgent2, axAgent3, axAgent4) и на вкладке Events дважды щелкаем по имени события ClickEvent. Появляется файл Form1.cs с шаблонами, которые после записи нашего кода принимают вид листингов 47.12, 47.13, 47.14.
Листинг 47.11. Метод, обрабатывающий щелчок по персонажу Genie.
private void axAgent1_ClickEvent(object sender,
AxAgentObjects._AgentEvents_ClickEvent e)
{
//Персонаж выполняет анимацию Confused:
myGenie.Play("Confused");
//Персонаж произносит текст:
mySpeech = "Есть проблемы?";
myGenie.Speak(mySpeech, myObject);
//Персонаж выполняет анимацию RestPose:
myGenie.Play("RestPose");
}
Листинг 47.12. Метод, обрабатывающий щелчок по персонажу Merlin.
private void axAgent2_ClickEvent(object sender,
AxAgentObjects._AgentEvents_ClickEvent e)
{
//Персонаж выполняет анимацию Confused:
myMerlin.Play("Confused");
//Персонаж произносит текст:
mySpeech = "Имеются проблемы?";
myMerlin.Speak(mySpeech, myObject);
//Персонаж выполняет анимацию RestPose:
myMerlin.Play("RestPose");
}
Листинг 47.13. Метод, обрабатывающий щелчок по персонажу Peedy.
private void axAgent3_ClickEvent(object sender,
AxAgentObjects._AgentEvents_ClickEvent e)
{
//Персонаж выполняет анимацию Confused:
myPeedy.Play("Confused");
//Персонаж произносит текст:
mySpeech = "Попка умный и хочет есть.";
myPeedy.Speak(mySpeech, myObject);
//Персонаж выполняет анимацию RestPose:
myPeedy.Play("RestPose");
}
Листинг 47.14. Метод, обрабатывающий щелчок по персонажу Robby.
private void axAgent4_ClickEvent(object sender,
AxAgentObjects._AgentEvents_ClickEvent e)
{
//Персонаж выполняет анимацию Confused:
myGenie.Play("Confused");
//Персонаж произносит текст:
mySpeech = "Есть проблемы?";
myGenie.Speak(mySpeech, myObject);
//Персонаж выполняет анимацию RestPose:
myGenie.Play("RestPose");
}
Листинг 47.15. Метод, чтобы Джин выполнял наши голосовые команды.
//Объявляем глобальный объект myCommand интерфейса
static AgentObjects.IAgentCtlUserInput myCommand;
private void axAgent1_Command(object sender,
AxAgentObjects._AgentEvents_CommandEvent e)
{
//Связываем объект myCommand с голосом пользователя:
myCommand =
(AgentObjects.IAgentCtlUserInput)(e.userInput);
//После команды голосом "MoveToMouse"
// персонаж перемещается на место курсора мыши:
if (myCommand.Voice == "MoveToMouse")
{
myGenie.MoveTo(
Convert.ToInt16(Cursor.Position.X),
Convert.ToInt16(Cursor.Position.Y), 1000);
}
//После команды голосом "Merlin"
//прежний персонаж скрывается, а новый появляется:
if (myCommand.Voice == "Merlin")
{
//Скрыть прежний персонаж:
myGenie.Hide(0);
//От начала координат в верхнем левом углу Form1
//задаем координаты "x,y" места нового персонажа:
myMerlin.MoveTo(
Convert.ToInt16(this.Location.X + 400),
Convert.ToInt16(this.Location.Y - 130), 1000);
//Показать новый персонаж в заданном месте:
myMerlin.Show(0);
//Чтобы персонаж произносил речь через динамики,
//задаем ему следующие свойства:
myAgentController = new AgentObjects.Agent();
myAgentController.Connected = true;
myAgentController.Characters.Load(
"merlin", "merlin.acs");
myMerlin =
myAgentController.Characters.Character("merlin");
//Новый персонаж произносит речь:
mySpeech = "Я - Маг. Есть проблемы?";
myMerlin.Speak(mySpeech, myObject);
}
}
Поясним этот код. После нашей голосовой команды Hide текущий персонаж скрывается (без написания дополнительного кода в данном листинге). Но если мы хотим, чтобы после произнесения нами одного из заданных по умолчанию имен персонажей (Genie, Merlin, Peedy, Robby), этот озвученный новый персонаж не просто появился в верхнем левом углу экрана, а появился в заданном нами месте и после этого произнес речь, мы должны записать это в коде, что мы и сделали в этом листинге.
Аналогично (для следующего персонажа) в панели Properties выбираем заголовок следующего элемента управления axAgent2 и на вкладке Events дважды щелкаем по имени события Command.
Появляется файл Form1.h с шаблоном (метода axAgent1_Command), который после записи нашего кода (согласно алгоритму) принимает следующий вид.
Листинг 47.16. Метод, чтобы Маг выполнял наши голосовые команды.
private void axAgent2_Command(object sender,
AxAgentObjects._AgentEvents_CommandEvent e)
{
//Связываем объект myCommand с голосом пользователя:
myCommand =
(AgentObjects.IAgentCtlUserInput)(e.userInput);
//После команды голосом "MoveToMouse"
//персонаж перемещается на место курсора мыши:
if (myCommand.Voice == "MoveToMouse")
{
myMerlin.MoveTo(
Convert.ToInt16(Cursor.Position.X),
Convert.ToInt16(Cursor.Position.Y), 1000);
}
//После команды голосом "Peedy"
//прежний персонаж скрывается, а новый появляется:
if (myCommand.Voice == "Peedy")
{
//Скрыть прежний персонаж:
myMerlin.Hide(0);
//От начала координат в верхнем левом углу Form1
//задаем координаты "x,y" места нового персонажа:
myPeedy.MoveTo(
Convert.ToInt16(this.Location.X + 400),
Convert.ToInt16(this.Location.Y - 130), 1000);
//Показать новый персонаж в заданном месте:
myPeedy.Show(0);
//Чтобы персонаж произносил речь через динамики,
//задаем ему следующие свойства:
myAgentController = new AgentObjects.Agent();
myAgentController.Connected = true;
myAgentController.Characters.Load(
"peedy", "peedy.acs");
myPeedy =
myAgentController.Characters.Character("peedy");
//Новый персонаж произносит речь:
mySpeech = "Я - Попугай. Есть проблемы?";
myPeedy.Speak(mySpeech, myObject);
}
}
Аналогично (для следующего персонажа) в панели Properties выбираем заголовок следующего элемента управления axAgent3 и на вкладке Events дважды щелкаем по имени события Command. Появляется файл Form1.cs с шаблоном (метода axAgent3_Command), который после записи нашего кода (согласно алгоритму) принимает следующий вид.
Листинг 47.17. Метод, чтобы Попугай выполнял наши голосовые команды.
private void axAgent3_Command(object sender,
AxAgentObjects._AgentEvents_CommandEvent e)
{
//Связываем объект myCommand с голосом пользователя:
myCommand =
(AgentObjects.IAgentCtlUserInput)(e.userInput);
//После команды голосом "MoveToMouse"
//персонаж перемещается на место курсора мыши:
if (myCommand.Voice == "MoveToMouse")
{
myPeedy.MoveTo(
Convert.ToInt16(Cursor.Position.X),
Convert.ToInt16(Cursor.Position.Y), 1000);
}
//После команды голосом "Robby"
//прежний персонаж скрывается, а новый появляется:
if (myCommand.Voice == "Robby")
{
//Скрыть прежний персонаж:
myPeedy.Hide(0);
//От начала координат в верхнем левом углу Form1
//задаем координаты "x,y" места нового персонажа:
myRobby.MoveTo(
Convert.ToInt16(this.Location.X + 400),
Convert.ToInt16(this.Location.Y - 130), 1000);
//Показать новый персонаж в заданном месте:
myRobby.Show(0);
//Чтобы персонаж произносил речь через динамики,
//задаем ему следующие свойства:
myAgentController = new AgentObjects.Agent();
myAgentController.Connected = true;
myAgentController.Characters.Load(
"robby", "robby.acs");
myRobby =
myAgentController.Characters.Character("robby");
//Новый персонаж произносит речь:
mySpeech = "Я - Робот. Есть проблемы?";
myRobby.Speak(mySpeech, myObject);
}
}
Аналогично (для следующего персонажа) в панели Properties выбираем заголовок следующего элемента управления axAgent4 и на вкладке Events дважды щелкаем по имени события Command. Появляется файл Form1.cs с шаблоном (метода axAgent4_Command), который после записи нашего кода (согласно алгоритму) принимает следующий вид.
Листинг 47.18. Метод, чтобы Робот выполнял наши голосовые команды.
private void axAgent4_Command(object sender,
AxAgentObjects._AgentEvents_CommandEvent e)
{
//Связываем объект myCommand с голосом пользователя:
myCommand =
(AgentObjects.IAgentCtlUserInput)(e.userInput);
//После команды голосом "MoveToMouse"
//персонаж перемещается на место курсора мыши:
if (myCommand.Voice == "MoveToMouse")
{
myRobby.MoveTo(
Convert.ToInt16(Cursor.Position.X),
Convert.ToInt16(Cursor.Position.Y), 1000);
}
//После команды голосом "Genie"
//прежний персонаж скрывается, а новый появляется:
if (myCommand.Voice == "Genie")
{
//Скрыть прежний персонаж:
myRobby.Hide(0);
//От начала координат в верхнем левом углу Form1
//задаем координаты "x,y" места нового персонажа:
myGenie.MoveTo(
Convert.ToInt16(this.Location.X + 400),
Convert.ToInt16(this.Location.Y - 130), 1000);
//Показать новый персонаж в заданном месте:
myGenie.Show(0);
//Чтобы персонаж произносил речь через динамики,
//задаем ему следующие свойства:
myAgentController = new AgentObjects.Agent();
myAgentController.Connected = true;
myAgentController.Characters.Load(
"genie", "genie.acs");
myGenie =
myAgentController.Characters.Character("genie");
//Новый персонаж произносит речь:
mySpeech = "Я - Джин. Есть проблемы?";
myGenie.Speak(mySpeech, myObject);
}
}
Отметим, что в программе речь персонажа мы можем записать не только на одной строке кода, но и на многих строках, как выше мы уже делали, например, при помощи такого кода:
mySpeech = "Попка умный " +
"и хочет есть.";
Аналогично мы можем записать код для решения любой подобной задачи согласно разработанному нами алгоритму.
Cтроим программу и запускаем на выполнение обычным образом: Build, Build Solution; Debug, Start Without Debugging. В ответ Visual C# выполняет программу и на рабочий стол выводит форму Form1 в режиме выполнения.
После щелчка первой кнопки “Показать Джина” появляется первый персонаж Genie (Джин) и произносит (через динамики компьютера) приветствующий нас текст (“Здравствуйте. Меня зовут Джин”), который мы записали выше в код программы.
В заключении этой главы дадим некоторые рекомендации по устранению ошибок, когда в режиме выполнения мы видим персонаж, но после нажатия клавиши Scroll Lock мы не видим никакой реакции персонажа на наше нажатие.