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

 

Листинг 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");

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

Выполнение программы

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

После загрузки Form1 на ней начинается показ нашего маленького мультфильма в следующей последовательности эпизодов.

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

//Персонаж выполняет анимацию Announce:

myGenie.Play("Announce");

//Произносит записанную нами речь:

mySpeech =

"Здравствуйте, меня зовут Джин. " +

"Спасибо за Ваше внимание ко мне.";

myGenie.Speak(mySpeech, myObject);

Одновременно над головой персонажа выводится динамическая подсказка, и внутри этой подсказки анимационно (в динамике) буква за буквой выводится текст, согласовано с движениями губ персонажа

Предлагаю ознакомиться с аналогичными статьями: