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

       

Управляемое вращение и перемещение фигуры


Листинг 56.1. Код проектирования и преобразования фигуры.

//Объявляем переменную 'i' для исходной позиции фигуры;

int i = 0;

//Объявляем объект нашего нового класса Animation и

//при помощи конструктора new создаем экземпляр объекта:

Animation myAnimation = new Animation();

//Вводим наш новый класс Animation:

class Animation

{

      //Объявляем и задаем шаги горизонтального offsetX

      //и вертикального offsetY перемещений фигуры

      //за один интервал времени:

      float offsetX = 6;



      float offsetY = 2;

      //Объявляем и задаем в градусах

      //шаг угла поворота фигуры:

      float step_alpha = 6;

      //Объявляем объекты класса GraphicsPath:

      GraphicsPath myGraphicsPath = new GraphicsPath();

      GraphicsPath myGraphicsPath2 = new GraphicsPath();

      //В классе Matrix объявляем

      //объекты-матрицы преобразований:

      //объект myMatrix1 - для поворота фигуры и

      //объект myMatrix2 - для перемещения фигуры:

      Matrix myMatrix1 = new Matrix();

      Matrix myMatrix2 = new Matrix();

      //Вводим конструктор нашего класса для задания фигуры

      //в виде окружности (методом AddEllipse)

      //и в виде линий (методом AddLine):

      public Animation()

      {

            myGraphicsPath.AddEllipse(70, 70, 100, 100);

            myGraphicsPath.AddLine(75, 100, 165, 100);

            myGraphicsPath.AddLine(75, 140, 165, 140);

            //При помощи клонирования

            //создаем объект myGraphicsPath2

            //как точную копию объекта myGraphicsPath:

            myGraphicsPath2 =

                       (GraphicsPath)myGraphicsPath.Clone();

      }

      //Вводим методо FigureDraw для преобразования

      //и рисования фигуры:

      public void FigureDraw(Graphics myGraphics, int j)

      {

            //Перемещаем фигуру:

            myMatrix2.Translate(offsetX, offsetY);

            //При помощи клонирования

            //создаем объект myGraphicsPath


            //как точную копию объекта myGraphicsPath2:
            myGraphicsPath =
                      (GraphicsPath)myGraphicsPath2.Clone();
            //Задаем точку, относительно которой
            //будет поворачиваться фигура:
            PointF myPointF =
                        myGraphicsPath.GetBounds().Location;
            myPointF.X = myPointF.X +
                       myGraphicsPath.GetBounds().Width / 2;
            myPointF.Y = myPointF.Y +
                      myGraphicsPath.GetBounds().Height / 2;
            //Поворачиваем фигуру по часовой стрелке
            //на один шаг step_alpha
            // при помощи метода RotateAt класса Matrix:
            myMatrix1.RotateAt(step_alpha, myPointF);
            //Применяем метод Transform класса GraphicsPath
            //для трансформирования матриц myMatrix:
            myGraphicsPath.Transform(myMatrix1);
            myGraphicsPath.Transform(myMatrix2);
          //Рисуем преобразованную фигуру:
          myGraphics.DrawPath(new Pen(Color.Red, 3),
                                            myGraphicsPath);
     }
}
В панели Properties (для PictureBox) на вкладке Events дважды щелкаем по имени события Paint. Появляется шаблон метода PictureBox_Paint, который после записи нашего кода принимает следующий вид.
Листинг 56.2.  Метод для элемента управления PictureBox.
private void pictureBox1_Paint(object sender,
                                            PaintEventArgs e)
{
    //Вызываем метод FigureDraw
    //для рисования фигуры в i-м положении:
    myAnimation.FigureDraw(e.Graphics, i);
    //Задаем следующее i-е положение фигуры:
    i = i + 1;
}
Чтобы установить значение свойства Interval компонента Timer в зависимости от свойства Value ползунка элемента управления TrackBar, дважды щелкаем элемент управления TrackBar в режиме проектирования. Появляется файл Form9.cs с шаблоном, который после записи нашего кода принимает следующий вид.
Листинг 56.3. Метод для элемента управления TrackBar.
private void trackBar1_Scroll(object sender, EventArgs e)
{
      timer1.Enabled = true;
      timer1.Interval = trackBar1.Value;
}
Чтобы подключить к работе таймер, дважды щелкаем значок для компонента Timer (ниже формы в режиме проектирования). Появляется файл Form9.cs с шаблоном, который после записи нашего кода принимает следующий вид.
Листинг 56.4. Метод для компонента Timer.
private void timer1_Tick(object sender, EventArgs e)
{
      pictureBox1.Refresh();
}

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