Компьютерная графика, мультимедиа и игры на Visual C#

       

Построение графика по


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

Содержание раздела