Построение графика по
Листинг 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.
В данной последней главе мы не только разработали новую графическую подсистему для визуализации результатов эксперимента (опыта), но и дополнили эту подсистему мультипликационными персонажами.
По этой методологии можно создавать разнообразные мультимедиа и игры, а также дополнять графические системы и другие приложения мультипликационными персонажами.