Компьютерная графика, мультимедиа и игры на Visual C#

       

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


Листинг 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 мы не видим никакой реакции персонажа на наше нажатие.

Содержание раздела