Эмиссия газов от очистных сооружений канализации: В последние годы внимание мирового сообщества сосредоточено на экологических проблемах...

Историки об Елизавете Петровне: Елизавета попала между двумя встречными культурными течениями, воспитывалась среди новых европейских веяний и преданий...

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

2017-05-23 311
Глава 48. Вывод на экран выступлений и анимаций всех персонажей 0.00 из 5.00 0 оценок
Заказать работу

Вверх
Содержание
Поиск

 

Листинг 48.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;

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

Object myObject = null;

 

А в шаблон (метода Form1_Load) записываем наш код (согласно постановке задачи для всех персонажей), и метод Form1_Load принимает такой вид.

 

Листинг 48.2. Загрузка персонажей в элементы управления.

 

private void Form1_Load(object sender, EventArgs e)

{

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

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

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

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

myGenie.LanguageID = 0x409;

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

axAgent2.Characters.Load("Merlin", DATAPATH_2);

myMerlin = axAgent2.Characters.Character("Merlin");

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

myMerlin.LanguageID = 0x409;

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

axAgent3.Characters.Load("Peedy", DATAPATH_3);

myPeedy = axAgent3.Characters.Character("Peedy");

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

myPeedy.LanguageID = 0x409;

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

axAgent4.Characters.Load("Robby", DATAPATH_4);

myRobby = axAgent4.Characters.Character("Robby");

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

myRobby.LanguageID = 0x409;

 

//Для всех четырех персонажей добавляем

//нашу голосовую команду, как пользователей,

//например, команду "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);

//Добавляем имя анимации, активизируемое голосом:

mySpeech = "Announce";

myGenie.Commands.Add(

mySpeech, mySpeech, mySpeech, true, true);

//Показываем какой-либо текущий персонаж:

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

//задаем координаты "x,y" места расположения

//текущего персонажа, например, Genie:

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");

myAgentController.Characters.Load(

"merlin", "merlin.acs");

myMerlin =

myAgentController.Characters.Character("merlin");

myAgentController.Characters.Load(

"peedy", "peedy.acs");

myPeedy =

myAgentController.Characters.Character("peedy");

myAgentController.Characters.Load(

"robby", "robby.acs");

myRobby =

myAgentController.Characters.Character("robby");

//Текущий персонаж произносит текст из кода

//и показывает этот текст в виде подсказки:

myGenie.Speak("Здравствуйте. Меня зовут Джин. " +

"Выберите, пожалуйста, персонаж, анимацию, " +

"запишите слова в окно и щелкните кнопку.", myObject);

//Добавляем в окно со списком ComboBox1

//имена CharacterID четырех персонажей:

comboBox1.Items.Add("Genie");

comboBox1.Items.Add("Merlin");

comboBox1.Items.Add("Peedy");

comboBox1.Items.Add("Robby");

}

В панели Properties выбираем заголовок comboBox1 (или щелкаем по элементу управления comboBox1) и на вкладке Events дважды щелкаем по имени события SelectedIndexChanged. Появляется файл Form1.cs с шаблоном, который после записи нашего кода (согласно алгоритму) принимает следующий вид.

 

 

Листинг 48.3. Метод для окна со списком comboBox1.

 

private void comboBox1_SelectedIndexChanged(

object sender, EventArgs e)

{

//Добавляем имена анимаций для выделенного

//(в окне со списком comboBox1) персонажа

//в окно со списком comboBox2:

 

We_Get_AnimationNames();

}

Чтобы это добавление имен анимаций (для выделенного в окне со списком comboBox1 персонажа) в окно со списком comboBox2 можно было вставлять в другие приложения, оформим это добавление в виде отдельного метода We_Get_AnimationNames, как показано на следующем листинге.

 

Листинг 48.4. Метод We_Get_AnimationNames.

 

private void We_Get_AnimationNames()

{

//Объявляем перечислители myEnumerator

//интерфейса IEnumerator

//для имен анимаций каждого персонажа:

System.Collections.IEnumerator myEnumerator1 =

axAgent1.Characters.Character("Genie").

AnimationNames.GetEnumerator();

System.Collections.IEnumerator myEnumerator2 =

axAgent2.Characters.Character("Merlin").

AnimationNames.GetEnumerator();

System.Collections.IEnumerator myEnumerator3 =

axAgent3.Characters.Character("Peedy").

AnimationNames.GetEnumerator();

System.Collections.IEnumerator myEnumerator4 =

axAgent4.Characters.Character("Robby").

AnimationNames.GetEnumerator();

//Если в окне со списком comboBox1

//выбран первый персонаж с индексом 0:

if (comboBox1.SelectedIndex == 0)

{

//Очищаем окно со списком ComboBox2:

comboBox2.Items.Clear();

//Организовываем цикл:

while (myEnumerator1.MoveNext())

//Добавляем имена анимаций этого персонажа

//в окно со списком comboBox2:

comboBox2.Items.Add(

myEnumerator1.Current);

}

//Если в окне со списком comboBox1

//выбран второй персонаж с индексом 1:

if (comboBox1.SelectedIndex == 1)

{

//Очищаем окно со списком ComboBox2:

comboBox2.Items.Clear();

//Организовываем цикл:

while (myEnumerator2.MoveNext())

//Добавляем имена анимаций этого персонажа

//в окно со списком comboBox2:

comboBox2.Items.Add(

myEnumerator2.Current);

}

//Если в окне со списком comboBox1

//выбран третий персонаж с индексом 2:

if (comboBox1.SelectedIndex == 2)

{

//Очищаем окно со списком ComboBox2:

comboBox2.Items.Clear();

//Организовываем цикл:

while (myEnumerator3.MoveNext())

//Добавляем имена анимаций этого персонажа

//в окно со списком comboBox2:

comboBox2.Items.Add(

myEnumerator3.Current);

}

//Если в окне со списком comboBox1

//выбран четвертый персонаж с индексом 3:

if (comboBox1.SelectedIndex == 3)

{

//Очищаем окно со списком ComboBox2:

comboBox2.Items.Clear();

//Организовываем цикл:

while (myEnumerator4.MoveNext())

//Добавляем имена анимаций этого персонажа

//в окно со списком comboBox2:

comboBox2.Items.Add(

myEnumerator4.Current);

}

}

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

если в левом окне со списком comboBox1 из четырех персонажей (Genie, Merlin, Peedy, Robby) мы выбираем какой-либо один персонаж,

а в правом окне со списком comboBox2 из более чем 70 анимаций мы выбираем какую-либо одну анимацию,

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

В панели Properties выбираем заголовок comboBox2 (или щелкаем по элементу управления comboBox2) и на вкладке Events дважды щелкаем по имени события SelectedIndexChanged. Появляется файл Form1.cs с шаблоном, который после записи нашего кода (согласно алгоритму) принимает следующий вид.

 

Листинг 48.5. Метод для окна со списком comboBox2.

 

private void comboBox2_SelectedIndexChanged(

object sender, EventArgs e)

{

//Персонаж произносит текст

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

//Если в окне со списком comboBox1

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

if (comboBox1.SelectedIndex == 0)

{

//Скрываем все другие персонажи:

myMerlin.Hide(0);

myPeedy.Hide(0);

myRobby.Hide(0);

//Останавливаем текущую анимацию:

myGenie.StopAll(myObject);

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

//задаем координаты "x, y" _

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

myGenie.MoveTo(

Convert.ToInt16(this.Location.X + 750),

Convert.ToInt16(this.Location.Y + 250), 1000);

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

myGenie.Show(0);

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

mySpeech = "Слушаюсь.";

myGenie.Speak(mySpeech, myObject);

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

myGenie.Play(comboBox2.SelectedItem.ToString());

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

myGenie.Play("RestPose");

}

//Если в окне со списком comboBox1

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

if (comboBox1.SelectedIndex == 1)

{

//Скрываем все другие персонажи:

myGenie.Hide(0);

myPeedy.Hide(0);

myRobby.Hide(0);

//Останавливаем текущую анимацию:

myMerlin.StopAll(myObject);

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

//задаем координаты "x, y" _

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

myMerlin.MoveTo(

Convert.ToInt16(this.Location.X + 750),

Convert.ToInt16(this.Location.Y + 250), 1000);

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

myMerlin.Show(0);

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

mySpeech = "Слушаюсь.";

myMerlin.Speak(mySpeech, myObject);

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

myMerlin.Play(comboBox2.SelectedItem.ToString());

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

myMerlin.Play("RestPose");

}

//Если в окне со списком comboBox1

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

if (comboBox1.SelectedIndex == 2)

{

//Скрываем все другие персонажи:

myGenie.Hide(0);

myMerlin.Hide(0);

myRobby.Hide(0);

//Останавливаем текущую анимацию:

myPeedy.StopAll(myObject);

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

//задаем координаты "x, y" _

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

myPeedy.MoveTo(

Convert.ToInt16(this.Location.X + 750),

Convert.ToInt16(this.Location.Y + 250), 1000);

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

myPeedy.Show(0);

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

mySpeech = "Слушаюсь.";

myPeedy.Speak(mySpeech, myObject);

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

myPeedy.Play(comboBox2.SelectedItem.ToString());

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

myPeedy.Play("RestPose");

}

//Если в окне со списком comboBox1

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

if (comboBox1.SelectedIndex == 3)

{

//Скрываем все другие персонажи:

myGenie.Hide(0);

myMerlin.Hide(0);

myPeedy.Hide(0);

//Останавливаем текущую анимацию:

myRobby.StopAll(myObject);

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

//задаем координаты "x, y" _

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

myRobby.MoveTo(

Convert.ToInt16(this.Location.X + 750),

Convert.ToInt16(this.Location.Y + 250), 1000);

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

myRobby.Show(0);

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

mySpeech = "Слушаюсь.";

myRobby.Speak(mySpeech, myObject);

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

myRobby.Play(comboBox2.SelectedItem.ToString());

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

myRobby.Play("RestPose");

}

}

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

если мы щелкнем кнопку на форме, но ничего не запишем в окно TextBox, то персонаж попросит нас записать текст в это окно;

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

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

 

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

 

private void button1_Click(object sender, EventArgs e)

{

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

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

myAgentController = new AgentObjects.Agent();

myAgentController.Connected = true;

myAgentController.Characters.Load(

"genie", "genie.acs");

myGenie =

myAgentController.Characters.Character("genie");

myAgentController.Characters.Load(

"merlin", "merlin.acs");

myMerlin =

myAgentController.Characters.Character("merlin");

myAgentController.Characters.Load(

"peedy", "peedy.acs");

myPeedy =

myAgentController.Characters.Character("peedy");

myAgentController.Characters.Load(

"robby", "robby.acs");

myRobby =

myAgentController.Characters.Character("robby");

//Персонаж произносит текст из окна TextBox

//при условии:

//Если окно TextBox не заполнено:

if (textBox1.Text == "")

{

if (comboBox1.SelectedIndex == 0)

{

mySpeech =

"Запишите, пожалуйста, в окно слова, " +

"которые я должен произнести.";

myGenie.Speak(mySpeech, myObject);

}

if (comboBox1.SelectedIndex == 1)

{

mySpeech =

"Запишите, пожалуйста, в окно слова, " +

"которые я должен произнести.";

myMerlin.Speak(mySpeech, myObject);

}

if (comboBox1.SelectedIndex == 2)

{

mySpeech =

"Запишите, пожалуйста, в окно слова, " +

"которые я должен произнести.";

myPeedy.Speak(mySpeech, myObject);

}

if (comboBox1.SelectedIndex == 3)

{

mySpeech =

"Запишите, пожалуйста, в окно слова, " +

"которые я должен произнести.";

myRobby.Speak(mySpeech, myObject);

}

}

else

//иначе, если окно TextBox заполнено,

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

{

mySpeech = textBox1.Text;

if (comboBox1.SelectedIndex == 0)

myGenie.Speak(mySpeech, myObject);

if (comboBox1.SelectedIndex == 1)

myMerlin.Speak(mySpeech, myObject);

if (comboBox1.SelectedIndex == 2)

myPeedy.Speak(mySpeech, myObject);

if (comboBox1.SelectedIndex == 3)

myRobby.Speak(mySpeech, myObject);

}

}

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

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

 

//Добавляем имя анимации, активизируемое голосом:

mySpeech = "Announce";

myGenie.Commands.Add(

mySpeech, mySpeech, mySpeech, true, true);

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

 

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

 

//Объявляем глобальный объект myCommand интерфейса

static AgentObjects.IAgentCtlUserInput myCommand;

 

private void axAgent1_Command(object sender,

AxAgentObjects._AgentEvents_CommandEvent e)

{

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

myCommand = (AgentObjects.IAgentCtlUserInput)

(e.userInput);

//Если выше при помощи метода Add мы добавили

//имя анимации, например, Announce

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

if (myCommand.Voice == "Announce")

{

//После голосовой команды останавливаем

//текущую анимацию:

myGenie.StopAll(myObject);

//Перед анимацией персонаж произносит:

mySpeech = "Охотно покажу эту анимацию.";

myGenie.Speak(mySpeech, myObject);

//Показывает анимацию, имя которой

//мы произнесли в микрофон:

myGenie.Play("Announce");

//Показывает анимацию в покое:

myGenie.Play("RestPose");

}

//После команды голосом "MoveToMouse"

//персонаж перемещается на место курсора мыши:

if (myCommand.Voice == "MoveToMouse")

{

myGenie.MoveTo(

Convert.ToInt16(Cursor.Position.X),

Convert.ToInt16(Cursor.Position.Y), 1000);

}

}

Поясним, что выше на листинге 48.2 в метод Form1_Load мы добавили голосовую команду MoveToMouse, поэтому в данном листинге приводим код для обработки также и этой команды (этот код подробно объяснен в предыдущей главе).

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

Cтроим программу и запускаем на выполнение обычным образом: Build, Build Solution; Debug, Start Without Debugging. В ответ Visual C# выполняет программу и на рабочий стол выводит форму Form1 в режиме выполнения.

И теперь на основании предыдущих глав разработаем методику создания мультфильма с использованием этих персонажей и их анимаций.

 


 


Поделиться с друзьями:

Автоматическое растормаживание колес: Тормозные устройства колес предназначены для уменьше­ния длины пробега и улучшения маневрирования ВС при...

Особенности сооружения опор в сложных условиях: Сооружение ВЛ в районах с суровыми климатическими и тяжелыми геологическими условиями...

Архитектура электронного правительства: Единая архитектура – это методологический подход при создании системы управления государства, который строится...

Механическое удерживание земляных масс: Механическое удерживание земляных масс на склоне обеспечивают контрфорсными сооружениями различных конструкций...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.171 с.