Среда программирования:
Visual studio 2012
using System; using System.Drawing; using System.Windows.Forms; namespace Demo_FunDots { public partial class MainForm : Form { //объявление Bitmap и графики Bitmap StaticBitmap; Graphics statGr; //объявление трех цветом для прорисовки Color clB, clR, clY; //объявление радиусов int rad1; //радиус "точек" int blowRad; // радиус текущего "взрыва" вокруг точки //переменная для хранения прозрачности рисуемых объектов int alpha; //центры рисуемых "точке" //голубые точки - первый и второй ряд int xb1, yb1; int xb2, yb2; //красные точки - первый и второй ряд int xr1, yr1; int xr2, yr2; //желтые точки - первый и второй ряд int xy1, yy1; int xy2, yy2; //переменные для контроля анимации и выбора цвета для анимации int animIter; int colorIter; public MainForm() { InitializeComponent(); } //функция, которая рисует статическую составляющую анимации void drawStatic() { //чёрный фон SolidBrush fon = new SolidBrush(Color.Black); statGr.FillRectangle(fon, 0, 0, PBox1.Width, PBox1.Height); //прорисовка всех "точек" при помощи функции drawGrid drawGrid(xb1, yb1, xb2, yb2, clB); drawGrid(xr1, yr1, xr2, yy2, clR); drawGrid(xy1, yy1, xy2, yr2, clY); } //прорисовка фона из "точек" void drawGrid(int x1, int y1, int x2, int y2, Color col) { int i, j; //переменные управляющие циклом int yt, xt; //переменные для хранения изменяемых координат //прорисовка первого слоя "точек" при помощи функции drawCircle xt = x1; // x1, y1, x2, y2 - соответственно центры "точек" for (i = 0; i < 5; i++) { yt = y1; for (j = 0; j < 7; j++) { drawCircle(xt, yt, col); yt += 95; } xt += 165; } //прорисовка второго слоя xt = x2; for (i = 0; i < 5; i++) { yt = y2; for (j = 0; j < 7; j++) { drawCircle(xt, yt, col); yt += 95; } xt += 165; } } //функция для рисования окружности по координатам её центра // (в отличии от имеющихся в C#, которые рисуют по краю прямоугольника void drawCircle(int x1, int y1, Color col) { //инициализация карандаша и заливки полученным цветом Pen p = new Pen(col); SolidBrush br = new SolidBrush(col); //пересчет координат прямоугольника, для вызова стандартной функции рисования int x3 = x1 - rad1; int y3 = y1 - rad1; //рисование и заливка окружности по пересчитанным координатам statGr.FillEllipse(br, x3, y3, 2 * rad1, 2 * rad1); statGr.DrawEllipse(p, x3, y3, 2 * rad1, 2 * rad1); } //функция отвечающая за анимацию "взрыва" вокруг точек void drawBlow(int x1, int y1, int x2, int y2,int kn, Color col) { int i, j; // переменные управления циклом int yt, xt; // переменные для хранения изменяемых координат при прорисовке int width = 0; // инициализация толщины пера рисования blowRad = 0; // инициализация радиуса "взрыва" switch (kn) // задание соответствующих значений толщины пера { // и радиуса "взрыва" по полученному состоянию анимации _kn_ case 1: width = 7; blowRad = rad1 + 5; break; case 2: width = 6; blowRad = rad1 + 12; break; case 3: width = 6; blowRad = rad1 + 19; break; case 4: width = 3; blowRad = rad1 + 26; break; case 5: width = 2; blowRad = rad1 + 30; break; case 6: // осуществление задержки (на один тик таймера return; // между взрывами у точек разного цвета } // прорисовка "взрывов" при помощи функции drawEdge xt = x1; for (i = 0; i < 5; i++) { yt = y1; for (j = 0; j < 7; j++) { drawEdge(xt, yt, width, col); yt += 95; } xt += 165; } xt = x2; for (i = 0; i < 5; i++) { yt = y2; for (j = 0; j < 7; j++) { drawEdge(xt, yt, width, col); yt += 95; } xt += 165; } } // функция для прорисовки окружности ("взрыва") по полученным координатам центра // работает аналогично функции drawCircle. Отличие в том, что не закрашивает область внутри void drawEdge(int x1, int y1, int width, Color col) { Pen p = new Pen(col); p.Width = width; int x3 = x1 - blowRad; int y3 = y1 - blowRad; statGr.DrawEllipse(p, x3, y3, 2 * blowRad, 2 * blowRad); } // анимация начинается после клика по форме (PictureBox) private void PBox1_Click(object sender, EventArgs e) { Graphics gr = PBox1.CreateGraphics(); //инициализация графики alpha = 255; // установление прозрачности //инициализация цветов "точек", по параметрам Alpha и RGB clB = Color.FromArgb(alpha, 100, 200, 220); clR = Color.FromArgb(alpha, 200, 75, 70); clY = Color.FromArgb(alpha, 240, 190, 65); // задание центров всех "точек". Соответственно первый и второй слой xb1 = 0; yb1 = 10; xb2 = 80; yb2 = 60; xr1 = 110; yr1 = 10; xr2 = 25; yr2 = 60; xy1 = 55; yy1 = 10; xy2 = 135; yy2 = 60; // задание радиуса "точек" rad1 = 10; //инициализация bitmap StaticBitmap = new Bitmap(500, 500, gr); // и графики для bitmap statGr = Graphics.FromImage(StaticBitmap); // включение сглаживания для графики statGr.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; //прорисовка статической части анимации drawStatic(); // отображение полученного изображения в bitmap на форму PBox1.Image = StaticBitmap; // задание переменных управляющих анимацией animIter = 0; //состояние анимации colorIter = 0; //задает какую точку обрабатываем timer1.Enabled = true; // включение таймера } //функция вызываемая при тике таймера private void timer1_Tick(object sender, EventArgs e) { animIter += 1; // переход к следующему этапу анимации drawStatic(); // прорисовка фона // проверяем текущее состояние обрабатываемой точки и // вызов соответствующей функции if (colorIter == 1) { drawBlow(xb1, yb1, xb2, yb2, animIter, clB); // уже в функцию передаем этап анимации } if (colorIter == 2) { drawBlow(xr1, yr1, xr2, yr2, animIter, clR); } if (colorIter == 3) { drawBlow(xy1, yy1, xy2, yy2, animIter, clY); } //отображаем bitmap на PictureBox PBox1.Image = StaticBitmap; // проверяем, если прошли все этапы анимации, // то переходим к следюущей точке и обнуляем этап анимации if (animIter >= 6) { animIter = 0; colorIter += 1; } // как только обработали все точки, то возвращаемся к первой if (colorIter >= 4) colorIter = 1; } } }
Прикрепленный файл | Размер |
---|---|
Skopinskiy_FunDots.zip | 58.81 кб |