Построение графика по точкам эксперимента и интеграция с мульти­пликационными персонажами MS Agent

 

Листинг 51.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 принимает такой вид.

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

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

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

myGenie.MoveTo(

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

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

//Первый персонаж произносит текст mySpeech

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

mySpeech = "Сидите за монитором прямо, " +

"как пианист.";

myGenie.Speak(mySpeech, myObject);

}

Чтобы следующий персонаж, например, Маг (Merlin) появился через заданное нами время, щелкаем по значку для первого компонента Timer и в панели Properties для этого компонента в свойстве Interval записываем данное время, например, 5000 миллисекунд (или 5 секунд) и запускаем таймер (в свойстве Enabled выбираем True).

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

Листинг 51.3. Метод для вызова персонажа через Interval времени.

private void timer1_Tick(object sender, EventArgs e)

{

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

myMerlin.MoveTo(

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

Convert.ToInt16(this.Location.Y - 130), 1000);

myMerlin.Show(0);

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

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

mySpeech = "Держите глаза от монитора " +

"на расстоянии вытянутой руки.";

myMerlin.Speak(mySpeech, myObject);

//Останавливаем генерирование события Tick:

timer1.Enabled = false;

}

Чтобы следующий персонаж, например, Попугай (Peedy) появился через заданное нами время, щелкаем по значку для второго компонента Timer и в панели Properties для этого компонента в свойстве Interval записываем данное время, например, 10000 миллисекунд (или 10 секунд) и запускаем таймер (в свойстве Enabled выбираем True). Теперь дважды щелкаем по значку для этого компонента Timer (или в панели Properties на вкладке Events дважды щелкаем по имени единственного там события Tick). Появляется файл Form1.cs с шаблоном (метода timer2_Tick), который после записи нашего кода принимает следующий вид.

Листинг 51.4. Метод для вызова персонажа через Interval времени.

private void timer2_Tick(object sender, EventArgs e)

{

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

myPeedy.MoveTo(

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

Convert.ToInt16(this.Location.Y - 130), 1000);

myPeedy.Show(0);

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

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

mySpeech = "Поднимите монитор, чтобы глаза были " +

"на уровне верхней кромки экрана.";

myPeedy.Speak(mySpeech, myObject);

//Останавливаем генерирование события Tick:

timer2.Enabled = false;

}

Чтобы следующий персонаж, например, Робот (Robby) появился через заданное нами время, щелкаем по значку для третьего компонента Timer и в панели Properties для этого компонента в свойстве Interval записываем данное время, например, 15000 миллисекунд (или 15 секунд) и запускаем таймер (в свойстве Enabled выбираем True). Теперь дважды щелкаем по значку для этого компонента Timer (или в панели Properties на вкладке Events дважды щелкаем по имени единственного там события Tick). Появляется файл Form1.cs с шаблоном (метода timer3_Tick), который после записи нашего кода принимает следующий вид.

Листинг 51.5. Метод для вызова персонажа через Interval времени.

private void timer3_Tick(object sender, EventArgs e)

{

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

myRobby.MoveTo(

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

Convert.ToInt16(this.Location.Y - 130), 1000);

myRobby.Show(0);

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

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

mySpeech = "Работайте на клавиатуре всеми пальцами.";

myRobby.Speak(mySpeech, myObject);

//Останавливаем генерирование события Tick:

timer3.Enabled = false;

}

Мы записали код для вывода на экран всех четырех персонажей. Чтобы один из этих персонажей, например, Джин (Genie) периодически (с заданным нами интервалом времени в компоненте Timer) повторял инструкцию пользователю (например, о том, как строить график на данной форме), щелкаем по значку для четвертого компонента Timer и в панели Properties для этого компонента в свойстве Interval записываем данный интервал времени, например, 18000 миллисекунд (или 18 секунд) и запускаем таймер (в свойстве Enabled выбираем True). Теперь дважды щелкаем по значку для этого компонента Timer (или в панели Properties на вкладке Events дважды щелкаем по имени единственного там события Tick). Появляется файл Form1.cs с шаблоном (метода timer4_Tick), который после записи нашего кода принимает следующий вид.

Листинг 51.6. Метод для произнесения инструкции через Interval времени.

private void timer4_Tick(object sender, EventArgs e)

{

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

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

mySpeech = "Запишите координаты точек целыми числами, " +

"щелкните верхнюю кнопку, и Вы увидите график. " +

"Чтобы стереть график, щелкните нижнюю кнопку.";

myGenie.Speak(mySpeech, myObject);

}

Мы видим, что в последнем методе, в отличие от трех предыдущих методов, мы не останавливаем генерирование события Tick (тем самым, не выключаем таймер) и даем возможность персонажу говорить до тех пор, пока мы не щелкнем по нему правой кнопкой и не выберем команду Hide (Скрыть).

Чтобы при помощи кнопки “1. Построить график” появился график функциональной зависимости y = f(x), дважды щелкаем или эту кнопку в режиме проектирования (рис. 51.1), или имя события Click в панели Properties на вкладке Events. Появляется шаблон, который после записи нашего кода принимает такой вид.

Листинг 51.7. Метод для обработки щелчка кнопки с целью рисования графика.

private void button1_Click(object sender, EventArgs e)

{

//Объявляем локальные переменные:

float x1, y1, x2, y2, x3, y3, x4, y4;

float x_O, y_O, x_end, y_end;

//Координаты начальной точки O:

x_O = 20; y_O = 20;

//Считываем координаты точек из окон:

x1 = Convert.ToSingle(textBox1.Text) + x_O;

y1 = -Convert.ToSingle(textBox2.Text) +

pictureBox1.Height - y_O;

x2 = Convert.ToSingle(textBox3.Text) + x_O;

y2 = -Convert.ToSingle(textBox4.Text) +

pictureBox1.Height - y_O;

x3 = Convert.ToSingle(textBox5.Text) + x_O;

y3 = -Convert.ToSingle(textBox6.Text) +

pictureBox1.Height - y_O;

x4 = Convert.ToSingle(textBox7.Text) + x_O;

y4 = -Convert.ToSingle(textBox8.Text) +

pictureBox1.Height - y_O;

//Создаем графический объект g класса Graphics:

Graphics g;

//Связываем графический объект g класса Graphics

//с элементом управления pictureBox1:

g = pictureBox1.CreateGraphics();

//Создаем перо для осей координат:

Pen myPenAxes = new Pen(Color.Black, 1);

//Строим ось координат x:

x_end = pictureBox1.Width - y_O;

g.DrawLine(myPenAxes,

x_O, pictureBox1.Height - y_O,

x_end, pictureBox1.Height - y_O);

//Строим ось координат y:

y_end = y_O;

g.DrawLine(myPenAxes,

x_O, pictureBox1.Height - y_O,

x_O, y_O);

//Создаем перо для графика:

Pen myPen = new Pen(Color.Black, 3);

//Строим график:

g.DrawLine(myPen, x1, y1, x2, y2);

g.DrawLine(myPen, x2, y2, x3, y3);

g.DrawLine(myPen, x3, y3, x4, y4);

}

Чтобы при помощи кнопки “2. Удалить график” график функциональной зависимости y = f(x) был стерт, дважды щелкаем или эту кнопку в режиме проектирования (рис. 51.1), или имя события Click в панели Properties на вкладке Events. Появляется шаблон, который после записи нашего кода принимает такой вид.

Листинг 51.8. Метод для обработки щелчка по кнопке.

private void button2_Click(object sender, EventArgs e)

{

//Создаем графический объект g класса Graphics:

Graphics g;

//Связываем графический объект g класса Graphics

//с элементом управления pictureBox1:

g = pictureBox1.CreateGraphics();

//Очистить pictureBox1, заполнив белым цветом White:

g.Clear(Color.White);

}

Мы закончили часть книги, в которой разработали методологию написания программ на Visual С# с целью создания сложных интерактивных компьютерных игр, мультфильмов, Интернет-магазинов и других практических приложений на основе мультимедийной программной технологии (платформы) Microsoft Agent версии 2.0.

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

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

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