Открылся форум посвещеный программированию, где можно обсуждать и задавать любые вопросы по 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-библиотека. |