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-библиотека.