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

       

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


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

//Объявляем персонаж Джина (Genie) и путь к его файлу:

static AgentObjects.IAgentCtlCharacterEx myGenie;

static String DATAPATH_1 = "Genie.acs";

//Объявляем член интерфейса Agent:

private AgentObjects.Agent myAgentController;

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

static String mySpeech;

//Объявляем общую для персонажей объектную переменную:

Object myObject = null;

Теперь необходимо написать нашу часть кода в шаблон главного метода Form1_Load, чтобы после загрузки Form1 на ней автоматически появился Джин, произносил тексты, перелетал на другое место за заданное нами время (например, з 15000 миллисекунд или 15 секунд) и выполнял анимации нашего мультфильма (пояснения даны в программе). Для этого дважды щелкаем по Form1 в режиме проектирования (или в панели Properties с заголовком Form1 на вкладке Events дважды щелкаем по имени события Load). Появляется файл Form1.cs с шаблоном (метода Form1_Load), который после записи нашего кода (согласно постановке задачи для персонажа Genie) принимает следующий вид.

                                                       

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

private void Form1_Load(object sender, EventArgs e)

{

      //Загружаем персонаж в элемент управления axAgent1:

      axAgent1.Characters.Load("Genie", DATAPATH_1);

      myGenie = axAgent1.Characters.Character("Genie");

      //Чтобы он выполнял голосовые команды на англ. яз.:

      myGenie.LanguageID = 0x409;

      //Чтобы персонаж произносил речь через динамики,

      //задаем ему следующие свойства:

      myAgentController = new AgentObjects.Agent();

      myAgentController.Connected = true;

      myAgentController.Characters.Load(

             "genie", "genie.acs");

      myGenie =

         myAgentController.Characters.Character("genie");

      //От начала координат в вехнем левом углу Form1


      //задаем координаты "x, y" _
      //места расположения персонажа:
      myGenie.MoveTo(
      Convert.ToInt16(this.Location.X + 250),
      Convert.ToInt16(this.Location.Y + 100), 1000);
      //Показываем персонаж:
      myGenie.Show(0);
      //Персонаж выполняет анимацию Announce:
      myGenie.Play("Announce");
      //Произносит записанную нами речь:
      mySpeech =
      "Здравствуйте, меня зовут Джин. " +
      " Спасибо за Ваше внимание ко мне.";
      myGenie.Speak(mySpeech, myObject);
      //Выполняет анимацию GestureRight:
      myGenie.Play("GestureRight");
      //Произносит речь:
      mySpeech = "Попросите меня сказать " +
               "текст из этого окна...";
      myGenie.Speak(mySpeech, myObject);
      //Перемещается к переключателям с именами анимаций
      //за заданное нами время, равное,
      //например, 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, myObject);
}
Теперь, следуя алгоритму в первом параграфе, мы записываем такой код, чтобы:
если мы щелкнем кнопку на форме, но ничего не запишем в окно TextBox, то персонаж попросит нас записать текст в это окно;
когда мы запишем в окно TextBox текст на русском языке и щелкнем кнопку на форме, то персонаж произнесет по-русски записанный нами текст.
Дважды щелкаем эту кнопку в режиме редактирования (или в панели Properties с заголовком button1 на вкладке Events дважды щелкаем по имени события Click).
Появляется файл Form1.cs с шаблоном (метода button1_Click), который после записи нашего кода принимает следующий вид.


Листинг 49.3. Метод для кнопки.
private void button1_Click(object sender, EventArgs e)
{
    // Персонаж произносит текст из окна TextBox
    //при условии:
    //Если окно TextBox не заполнено:
    if (textBox1.TextLength == 0)
    {
        mySpeech =
        "Запишите, пожалуйста, в окно слова, " +
        "которые я должен произнести.";
        myGenie.Speak(mySpeech, myObject);
    }
    else
    //иначе, если окно TextBox заполнено,
    //персонаж произносит слова из этого TextBox:
    {
        mySpeech = textBox1.Text;
        myGenie.Speak(mySpeech, myObject);
    }
}
Записываем код, чтобы после нашего щелчка мышью (или после нажатий двух клавиш, например, для первого переключателя: Alt+1) по первому переключателю с именем анимации Announce, персонаж:
произносил речь;
показывал выбранную нами анимацию.
Для этого дважды щелкаем первый переключатель в режиме редактирования (или в панели Properties с заголовком radioButton1 на вкладке Events дважды щелкаем по имени события CheckedChanged).
Появляется файл Form1.cs с шаблоном (метода radioButton1_CheckedChanged), который после записи нашего кода принимает такой вид.
Листинг 49.4. Метод для переключателя.
private void radioButton1_CheckedChanged(
object sender, EventArgs e)
{
      //Останавливаем все предыдущие действия персонажа:
      myGenie.StopAll(myObject);
      //Перед анимацией персонаж произносит фразу:
      mySpeech = "Охотно выполняю эту анимацию.";
      myGenie.Speak(mySpeech, myObject);
      //Показываем выбранную нами анимацию персонажа:
      myGenie.Play("Announce");
      //Показываем анимацию персонажа в покое:
      myGenie.Play("RestPose");
}
Аналогично последовательно дважды щелкаем по каждому последующему переключателю в режиме редактирования и в каждый шаблон метода записываем такой же (как на предыдущем листинге) код, только строку с именем предыдущей анимации заменяем на соответствующую строку из следующих девяти строк (по числу оставшихся переключателей) с именами новой анимации:
        myGenie.Play("Congratulate");
        myGenie.Play("Congratulate_2");
        myGenie.Play("DontRecognize");
        myGenie.Play("Explain");
           myGenie.Play("GetAttention");
           myGenie.Play("Suggest");
        myGenie.Play("Surprised");
        myGenie.Play("Wave");
        myGenie.Play("Write");
Аналогично можно записать код для решения любой подобной задачи согласно разработанному нами алгоритму.

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