- •Введение
- •Часть I. Краткие основы Visual c# Глава 1. Основные определения книги
- •1.1. Требования для установки Visual Studio 2005
- •Глава 2. Методика разработки приложений для выполнения расчетов с эффектами анимации
- •Глава 3. Методика разработки приложений на нескольких формах
- •Часть II. Методология проектирования графики и печати на принтере Глава 4. Краткие сведения о графических возможностях Visual Studio
- •Глава 5. Рисование простых линий на форме или элементах управления и печать этих линий
- •Глава 6. Рисование сложных линий и печать всей формы как снимка экрана
- •Глава 8. Рисование текста и печать текстового файла
- •Глава 7. Рисование заполненных фигур и печать всей формы с предварительным просмотром
- •Часть III. Методология вычислений на основе Visual c# с использованием эффектов анимации Глава 9. Методика создания вычислительной системы
- •Глава 10. Арифметические вычисления
- •10.3. Анимация в виде циклического изменения непрозрачности панели
- •Глава 11. Разработка стандартного калькулятора
- •11.3. Анимация в виде циклического изменения цвета формы
- •11.4. Выполнение расчетов
- •Глава 12. Вычисление процентов
- •Глава 13. Степени, корни, логарифмы и факториалы
- •Часть IV. Методология вычислений на основе интеграции Visual c# с другими платформами Глава 14. Использование в Visual c# программ из Excel
- •Глава 15. Вычисление сложных математических выражений
- •Часть V. Интеграция Visual c# с Word Глава 16. Оглавление приложения по использованию методов Word
- •Глава 17. Запуск Word, добавление нового и открытие существующего документа
- •17.3. Выполнение программы
- •Часть VI. Получение расчетных параметров из баз данных Access Глава 18. Оглавление приложения по использованию Access
- •18.1. Алгоритм оглавления и проектирование формы
- •Глава 19. Открытие Access
- •Часть VII. Создание баз данных и интеграция с другими субд Глава 20. Создание баз и наборов данных
- •Глава 21. Архитектура доступа к данным ado.Net
- •Глава 22. Разработка баз данных при помощи шаблонов
- •22.1. Создание проекта sql Server Project
- •Часть VIII. Методология создания графической системы в двухмерном пространстве Глава 23. Алгоритмы и оглавление графической системы
- •Глава 24. График линейной функции
- •Глава 25. Графики типичных функций
- •Глава 26. Рисование при помощи перемещения мыши
- •Глава 27. Рисование линий при помощи нажатия кнопки мыши
- •Глава 28. Рисование прямоугольников и эллипсов при помощи нажатия кнопки мыши
- •Глава 29. Рисование заполненных прямоугольников и эллипсов при помощи нажатия кнопки мыши
- •Глава 30. Непрерывный график-осциллограмма и его проверка при помощи диспетчера задач и файла подкачки
- •Часть IX. Методология создания графической системы в трехмерном пространстве Глава 31. Теория и алгоритмы системы
- •32.1. Основные схемы интеграции
- •Глава 33. Изображение и управление трехмерными объектами в трехмерном пространстве
- •Глава 34. Изображение и управление трехмерными объектами в трехмерном пространстве на Visual Basic для интеграции с Visual c# и другими языками
- •Глава 35. Изображение объектов в трехмерном пространстве на Visual c# по данным из проекта на Visual Basic
- •35.1. Постановка задачи и проектирование формы
- •Глава 37. Изображение и управление поверхностями в трехмерном пространстве
- •Глава 40. Расчет и изображение линий уровня на поверхности
- •Часть X. Методология создания анимационной трехмерной графики на основе новых версий Visual c# и DirectX Глава 44. Методика проектирования неподвижных и подвижных плоских фигур
- •Глава 45. Методика проектирования неподвижных и подвижных пространственных фигур
- •Часть XI. Методология разработки мультимедиа и игр на основе Microsoft Agent Глава 46. Загрузка и установка компонентов Microsoft Agent
- •46.1. Краткие сведения о Microsoft Agent
- •Глава 47. Методика управления мультипликационными персонажами
- •Глава 48. Вывод на экран выступлений и анимаций всех персонажей
- •Глава 49. Методика создания компьютерных игр и мультфильмов
- •49.4. Выполнение программы
- •Глава 50. Пример Интернет-магазина на основе Microsoft Agent
- •Глава 51. Построение графика по точкам эксперимента и интеграция с мультипликационными персонажами ms Agent
- •Часть XII. Методология анимации объектов Глава 52. Оглавление системы программ для анимации объектов
- •52.1. Алгоритм и проект системы
- •Глава 53. Варианты часов с цифровой индикацией, индикаторами прогресса и датой
- •Глава 54. Вращение линии
- •Глава 55. Управляемое вращение линии
- •Глава 56. Управляемое вращение и перемещение фигуры
- •Глава 57. Управляемое заполнение фигур
- •Глава 58. Управляемый мигающий текст
- •Глава 59. Методика изображения летающих предметов
- •Глава 60. Методика анимации градиентного заполнения текста цветом
- •Глава 61. Вращающееся градиентное заполнение фигур цветом
- •Глава 62. Изображение кругов на воде с использованием двойной буферизации
- •Глава 63. Анимация текста в консольном приложении
- •Часть XIII. Методология создания, конвертирования и мультипликации изображений на форме Глава 64. Методика задания, конвертирования и поочередной замены изображений
- •Глава 65. Методика разработки мультипликации
- •Глава 66. Разработка мультипликации при помощи списка рисунков
- •Глава 67. Методика управления цветом изображения
- •Часть XIV. Воспроизведение аудио и видео Глава 68. Оглавление приложения по интеграции Visual c# с Windows Media Player
- •Глава 69. Воспроизведение аудио файлов из приложения Visual с#
- •Глава 70. Воспроизведение видео файлов из приложения Visual c#
- •70.3. Выполнение программы
- •Глава 72. Интеграция Visual c# с браузером Internet Explorer
- •Глава 73. Установка веб-компонентов Windows для веб-программирования на основе asp.Net
- •Часть XVI. Введение в программирование мобильных устройств Глава 74. Программирование портативных и карманных компьютеров
- •Часть XVII. Приложения Visual c# для использования на практике, например, в промышленности Глава 75. Алгоритмы для расчета площади, объема и массы изделий и заготовок
- •75.1. Объектно-ориентированный анализ геометрии изделий
- •Глава 76. Консольное приложение для расчета массы изделий
- •Глава 77. Вычисление массы изделий при помощи формы
- •Часть XVIII. Приложения Visual c# для использования в учебе и науке Глава 78. Ввод в систему свойств материалов для изготовления изделий
- •Глава 79. Математическое моделирование обработки заготовки при помощи аналитических решений
- •Глава 80. Математическое моделирование обработки заготовки при помощи метода конечных элементов
- •Глава 81. Математическое моделирование и графика для типичных техпроцессов
- •Глава 82. Методология учета анизотропии материала при проектировании техпроцесса изготовления изделия
- •Глава 83. Методология проектирования техпроцессов изготовления изделий коробчатой формы
- •Часть XIX. Методология создания и внедрения систем компьютерного проектирования Глава 84. Оптимизация раскроя материалов
- •Глава 85. Система компьютерного проектирования техпроцессов
- •Глава 86. Проектирование заготовительных операций подготовки материала
- •Глава 87. Проектирование операций изготовления заготовок
- •Глава 88. Проектирование операций обработки заготовок
- •Глава 89. Проектирование финишных операций изготовления изделий
- •Заключение
- •Часть XX. Передача приложения заказчику Глава 90. Методика передачи приложения пользователю
- •90.1. Этапы разработки программы для установки приложения
- •90.2. Создание проекта для установки приложения
- •Описание содержимого компакт-диска и схема использования
- •Список литературы
- •Предметный указатель
Глава 48. Вывод на экран выступлений и анимаций всех персонажей
Листинг 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 в режиме выполнения.
И теперь на основании предыдущих глав разработаем методику создания мультфильма с использованием этих персонажей и их анимаций.
