Открылся форум посвещеный программированию, где можно обсуждать и задавать любые вопросы по C++, C#, Visual Basic, Windows Forms

Форум

  5. Использование Bit-карт для создания эффекта движения.

 

            Создайте новый проект, добавте таймер, установите интервал - 30 и перейдите на написание кода в область переменных и обработки таймера добавте такой код:

 

      Bitmap[] Pic = new Bitmap[100];

      Graphics c = null;

      Pen Pn = new Pen(Color.Black);

      Brush Br = new SolidBrush(Color.Aqua);

      int[] x = new int[200]; int[] y = new int[200]; int s = 0; double  sp=1;

 

      private void timer1_Tick(object sender, EventArgs e)

        {

            s += 1;

            if (s == 40)

            { s = 1; }

            Invalidate();

        }

 

            В области переменных мы делаем массив с Bitmap-изображениями Pic[100], которые с помощью таймера будут поочередно менятся создавая эффект движения. Теперь наберем код рисования:

 

        private void Form1_Paint(object sender, PaintEventArgs e)

        {

            if (s == 0)

            {

                Random rand = new Random(Environment.TickCount);

                for (int i = 0; i < 200; i++)

                {

                    do

                    {

                        x[i] = rand.Next(0, 200);

                        y[i] = rand.Next(0, 200);

                    } while (x[i] * x[i] + y[i] * y[i] > 35000);

                }

               for (int i0 = 1; i0 < 100; i0++)

                {

                   sp = Convert.ToDouble(Math.Sqrt(i0))/10;

                   Pic[i0-1] = new Bitmap(400, 400, e.Graphics);

                   c = Graphics.FromImage(Pic[i0 - 1]);

                   for (int i1 = 0; i1 < 50; i1++)

                   {

                       c.FillEllipse(Br, Convert.ToInt32(x[i1] * sp + 200), Convert.ToInt32(y[i1] * sp + 200), 8, 8);

                       c.DrawEllipse(Pn, Convert.ToInt32(x[i1] * sp + 200), Convert.ToInt32(y[i1] * sp + 200), 8, 8);

                   }

                   for (int i1 = 50; i1 < 100; i1++)

                   {

                       c.FillEllipse(Br, Convert.ToInt32(x[i1] * sp + 200), 200-Convert.ToInt32(y[i1] * sp ), 8, 8);

                       c.DrawEllipse(Pn, Convert.ToInt32(x[i1] * sp + 200), 200-Convert.ToInt32(y[i1] * sp ), 8, 8);

                   }

                   for (int i1 = 100; i1 < 150; i1++)

                   {

                       c.FillEllipse(Br, 200-Convert.ToInt32(x[i1] * sp ), Convert.ToInt32(y[i1] * sp + 200), 8, 8);

                       c.DrawEllipse(Pn, 200-Convert.ToInt32(x[i1] * sp ), Convert.ToInt32(y[i1] * sp + 200), 8, 8);

                   }

                   for (int i1 = 150; i1 < 200; i1++)

                   {

                       c.FillEllipse(Br, 200-Convert.ToInt32(x[i1] * sp ), 200-Convert.ToInt32(y[i1] * sp ), 8, 8);

                       c.DrawEllipse(Pn, 200-Convert.ToInt32(x[i1] * sp ), 200-Convert.ToInt32(y[i1] * sp ), 8, 8);

                   }

                }

                s = 1;

            }

            e.Graphics.DrawImage(Pic[s - 1], 0, 0);

        }

 

В этом коде сначала случайным образом формируем два массива x [200] и y [200], таких, чтобы образовывали заполненый круг, что обеспечивается условием: while (x[i] * x[i] + y[i] * y[i] > 35000). После этого вложенными циклами формируются бит-изображения размером 400х400: Pic[i0-1] = new Bitmap(400, 400, e.Graphics), после чего в них рисуется круги с черным ободом. Чтобы программа не прорисовывала их ещё раз, мы делаем условие, которое выполняется только один раз: if (s == 0) ,потом переменной s присваевается значение 1 и на экран с каждым тиком таймера выводится один из Bit-образов: e.Graphics.DrawImage(Pic[s - 1], 0, 0). Чтобы создавался эффект замедления мы используем коэффициент: sp = Convert. ToDouble(Math.Sqrt(i0))/10. Здесь используется функция извлечения корня: Sqrt. Чтобы она работала, подключается Math-библиотека.

Конструктор сайтов - uCoz