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

       

Методика разработки мульти­пликации


Теперь в файл Form1.cs необходимо написать нашу часть кода для выполнения  мультипликации. Сначала в любом месте внутри класса Form1 (например, ниже свернутого блока кода) объявляем массив и глобальные переменные:

//Объявляем массив из 6 изображений:

Image[] myArrayImages = new Image[6];

//Объявляем и инициализируем целочисленные переменные:

int j = 0; int k = 1;

Дважды щелкаем по Form1 в режиме проектирования (или Properties, Events, Load) и в шаблон записываем такой наш код.

Листинг 65.1. Метод Form1_Load для загрузки рисунков.

private void Form1_Load(object sender, EventArgs e)

{

      //Из графических файлов 6 рисунков формата (.bmp)

      //заполняем массив myArrayImages[6]:

      myArrayImages[0] = Image.FromFile("E:/MyDocs/" +

      "Анимация/Рисунки анимации/DeepDrawing_step0.bmp");



      myArrayImages[1] = Image.FromFile("E:/MyDocs//" +

      "Анимация/Рисунки анимации/DeepDrawing_step1.bmp");

      myArrayImages[2] = Image.FromFile("E:/MyDocs/" +

      "Анимация/Рисунки анимации/DeepDrawing_step2.bmp");

      myArrayImages[3] = Image.FromFile("E:/MyDocs/" +

      "Анимация/Рисунки анимации/DeepDrawing_step3.bmp");

      myArrayImages[4] = Image.FromFile("E:/MyDocs/" +

      "Анимация/Рисунки анимации/DeepDrawing_step4.bmp");

      myArrayImages[5] = Image.FromFile("E:/MyDocs/" +

      "Анимация/Рисунки анимации/DeepDrawing_step5.bmp");

}

Напомним, что метод Form1_Load выполняется одновременно с появлением (загрузкой – Load) Form1 на экране монитора. При этом рисунки мультипликации из любой папки загружаются в массив рисунков myArrayImages[N] с любым (заданным нами) количеством элементов N. Отметим, что в этом листинге полный путь расположения файла каждого рисунка формата (.bmp), начиная от диска E, записан на двух строках по правилу переноса на C#.

Аналогично в приложение загружаются другие рисунки в другие массивы рисунков, если мы хотим чередовать мультипликацию из серии одних рисунков сериями других рисунков.


Чтобы подключить к работе таймер, дважды щелкаем значок timer1 (ниже формы в режиме проектирования). Появляется файл Form1.cs с шаблоном, который после записи нашего кода принимает следующий вид.
Листинг 65.2. Метод для мультипликации изображений.
private void timer1_Tick(object sender, EventArgs e)
{
      //Создаем объект myGraphics класса Graphics:
      Graphics myGraphics = CreateGraphics();
      //Вызываем метод DrawImage, используя перегрузку №8:
      myGraphics.DrawImage(myArrayImages[j], -10, -10,
      myArrayImages[j].Width, myArrayImages[j].Height);
      //Высвобождаем ресурсы, выделенные объекту myGraphics:
      myGraphics.Dispose();
      //Организовываем цикл для шести рисунков:
      j = j + k;
      if (j == 5)
      {
            //От последнего рисунка переходим к первому:
            k = -5;
      }
      else if (j == 0)
      {
            //Задаем первый рисунок для начала цикла:
            k = 1;
      }
}
В этом коде главным является вызов перегруженного метода DrawImage, который в VC# имеет много видов перегрузки. Здесь использована перегрузка с сигнатурой Graphics.DrawImage Method(Image, Int32, Int32, Int32, Int32).
Напомним, что система координат связана с  Form1, а начало координат (0, 0) расположено в верхнем левом углу этой Form1. Координаты (-10, -10)  в коде являются координатами верхнего левого угла j – го рисунка (j = 0, 1, 2, 3, 4, 5). Изменяя эти координаты, мы можем удобнее расположить рисунок на Form1. Последние два параметра в методе DrawImage определяют ширину и высоту рисунка на форме Form1.
Учитывая важность данного кода для использования на практике, приведем его второй вариант. А именно, вместо вывода рисунков при помощи метода DrawImage (точнее, вместо приведенной на листинге строки кода с этим методом), мультипликацию можно выводить в рамку рисунка pictureBox1 (предварительно расположив этот элемент PictureBox на форме) при помощи кода:
   //Центрируем каждый рисунок внутри рамки pictureBox1:


   pictureBox1.SizeMode =
                        PictureBoxSizeMode.CenterImage;
   //Выводим j-е рисунки с интервалом Interval:
pictureBox1.Image = myArrayImages[j];
Чтобы установить значение свойства Interval компонента Timer в зависимости от свойства Value ползунка элемента управления TrackBar, дважды щелкаем элемент управления TrackBar в режиме проектирования. Появляется файл Form1.cs с шаблоном, который после записи нашего кода принимает вид следующей процедуры:
Листинг 65.3. Метод для элемента управления TrackBar.
private void trackBar1_Scroll(object sender,
                                         EventArgs e)
{
      //Устанавливаем свойство Enabled таймера, равным True:
      timer1.Enabled = true;
      //Устанавливаем значение свойства Interval таймера
      //в зависимости от перемещения ползунка Value:
      timer1.Interval = trackBar1.Value;
}
Согласно разработанной выше методике, чтобы иметь возможность приостановить (и запустить вновь) процесс анимации на любом рисунке при помощи кнопки Stop Animation, дважды щелкаем эту кнопку в режиме проектирования (рис. 65.8). Появляется файл Form1.cs с шаблоном, который после записи нашего кода имеет такой вид.
 
Листинг 65.4. Обработчик щелчка кнопки Stop Animation.
//Объявляем булеву переменную OffOn
//и задаем ей значение, например, false:
bool OffOn = false;
private void button6_Click(object sender, EventArgs e)
{
      //Задаем чередование остановки и возобновления анимации
      //после каждого щелчка кнопки button:
      if (OffOn == false)
      {
          //Приостанавливаем анимацию:
          timer1.Enabled = false;
          //Изменяем значение OffOn на противоположное:
          OffOn = true;
      }
      else
      {
          //Возобновляем анимацию:
          timer1.Enabled = true;
          //Изменяем значение OffOn на противоположное:
          OffOn = false;
      }
}
Листинг 65.5. Метод для компонента PrintDocument.
private void printDocument1_PrintPage(object sender,


               System.Drawing.Printing.PrintPageEventArgs e)
{
      //Чтобы печатать тот j-й рисунок, который видим:
      j = j - 1;
      //Выводим j- й рисунок, который видим на экране,
      //при помощи метода DrawImage, используя перегрузку 8:
      e.Graphics.DrawImage(myArrayImages[j], -10, -10,
      myArrayImages[j].Width,
      myArrayImages[j].Height);
}
Теперь дважды щелкаем кнопку Print (рис. 65.8). Открывается файл Form1.cs с шаблоном, который после записи нашего кода принимает такой вид.
Листинг 65.6. Обработчик щелчка кнопки Print.
private void button3_Click(object sender, EventArgs e)
{
     //Передаем объекту PrintDialog1 информацию об объекте
     //PrintDocument1 при помощи свойства Document:
     printDialog1.Document = printDocument1;
     //Выводим стандартную панель Print при помощи метода
     //ShowDialog для задания параметров печати:
     if (printDialog1.ShowDialog() == DialogResult.OK)
         printDocument1.Print();
}
Проверяем в действии созданную нами программу для печати на принтере любого рисунка мультипликации (на примере изготовления стакана). Для этого получаем на экране монитора (по описанной выше методике) разработанную мультипликацию, останавливаем мультипликацию на интересующем нас рисунке (при помощи кнопки Stop Animation) и щелкаем кнопку Print.
Щелкая кнопки Stop Animation и Print в различные моменты изменения (мультипликации) рисунка, мы получим на принтере распечатки различных (во времени) положений рисунка.
Таким образом, по разработанной в данной главе методике можно спроектировать мультипликацию на экране монитора и печать текущего положения мультипликации на принтере для любого технологического процесса изготовления детали (изделия, вещи), любого рисунка, чертежа или схемы.

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