Методика создания компьютерных игр и мультфильмов
Листинг 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");
Аналогично можно записать код для решения любой подобной задачи согласно разработанному нами алгоритму.