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

         

Изображение кругов на воде с использованием двойной буферизации 


Листинг 62.1. Шаблон метода Form1_Load с кодом.

//Массив окружностей:

myClass[] Circles = new myClass[100];

//В структуре Point объявляем объект myPoint:

Point myPoint;

//Генератор случайных чисел:

Random myRandow;

int c, j;

private void myMethod()

{

      Circles[c] = new myClass(myPoint);

      c = c + 1;

      if (c >= Circles.Length) c = 0;

}

private void Form1_Load(object sender, EventArgs e)

{



      //Используем двойную буферизацию:

      this.SetStyle(ControlStyles.OptimizedDoubleBuffer |

            ControlStyles.AllPaintingInWmPaint, true);

      myRandow = new Random();

      myMethod();

}

В панели Properties для элемента управления PictureBox на вкладке Events дважды щелкаем по имени события Paint и в шаблон записываем следующий код.

Листинг 62.2. Шаблон метода pictureBox1_Paint с кодом.

private void pictureBox1_Paint(object sender,

PaintEventArgs e)

{

      Color myColor = Color.Black;

      float f;

      e.Graphics.SmoothingMode =

            System.Drawing.Drawing2D.SmoothingMode.HighQuality;

      int k;

      for (k = 0; k <= c - 1; k++)

      {

            f = 0.05f * Circles[k].value;

            e.Graphics.DrawEllipse(new Pen(myColor, f),

                  Circles[k].pos.X - Circles[k].value,

                  Convert.ToInt32(Circles[k].pos.Y - Circles[k].value / 4),

                  Circles[k].value * 2,

                  Convert.ToInt32(Circles[k].value / 2));

            Circles[k].value = Circles[k].value + 10;

            if (Circles[k].value > 100) Circles[k].Reset();

      }

}

Чтобы подключить к работе таймер, дважды щелкаем значок timer1 (ниже формы в режиме проектирования). Появляется файл Form1.cs с шаблоном, который после записи нашего кода принимает такой вид.

Листинг 62.3. Метод для компонента Timer1.

private void timer1_Tick(object sender, EventArgs e)

{

      myMethod();

      Refresh();

      j = j + 1;

      if (j > myRandow.Next(30))

      {

            j = 0;

            myPoint.X = myRandow.Next(pictureBox1.Width);

            myPoint.Y = myRandow.Next(pictureBox1.Height);

            c = 0;

      }

}

Листинг 62.4. Дополнительный класс.

class myClass

{

      public Point pos = Point.Empty;

      public int value = 0;

      public myClass(Point pos)

      {

            Reset();

            this.pos = pos;

      }

      public void Reset()

      {

            pos = Point.Empty;

            value = 0;

      }

}



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