Язык программирования:
C#
Среда программирования:
Microsoft Visual Studio 2013
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace demoscene2 { public partial class Form1 : Form { private Bitmap bitmap; //создаем битмэп private Graphics graphix; //создаем графику SolidBrush background = new SolidBrush(Color.Tomato); //создаем кисть для фона... SolidBrush fill1 = new SolidBrush(Color.Black); //... для первой стороны куба SolidBrush fill2 = new SolidBrush(Color.Goldenrod); //... для второй стороны куба SolidBrush fill3 = new SolidBrush(Color.Gold); //... для третьей стороны куба float x1, x2, x3, x4, y1, y2, y3, y4, z1, z2, z3, z4; //эти переменные являются точками, //по которым будут строится стороны куба float parameter1, parameter2, parameter3; //"parameter" - это значение, на которое будет //изменяться положение стороны куба //1, 2, 3 - первая, второя и третья стороны куба //соответственно int step; //"step" - переменная цикла public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { timer1.Start(); } private void sides() //функция рисования сторон куба { bitmap = new Bitmap(pictureBox1.Width, pictureBox1.Height); //инициализируем битмэп graphix = Graphics.FromImage(bitmap); //инициализируем графику graphix.FillRectangle(background, 0, 0, pictureBox1.Width, pictureBox1.Height); //закрашиваем фон graphix.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; //растеризация граней куба //задаем координаты первой стороны куба здесь: PointF x1 = new PointF(134, 273-parameter1); PointF x2 = new PointF(210, 200-parameter1); PointF x3 = new PointF(286, 273-parameter1); PointF x4 = new PointF(211, 348-parameter1); //задаем координаты второй стороны куба здесь: PointF y1 = new PointF(134-parameter2, 274-parameter2); PointF y2 = new PointF(210-parameter2, 200-parameter2); PointF y3 = new PointF(210-parameter2, 75-parameter2); PointF y4 = new PointF(134-parameter2, 149-parameter2); //задаем координаты третьей стороны куба здесь: PointF z1 = new PointF(210+parameter3, 75-parameter3); PointF z2 = new PointF(286+parameter3, 149-parameter3); PointF z3 = new PointF(286+parameter3, 273-parameter3); PointF z4 = new PointF(210+parameter3, 200-parameter3); PointF[] sidebottom = { x1, x2, x3, x4 }; //создаем массив точек для первой стороны... graphix.FillPolygon(fill1, sidebottom); //закрашиваем сторону PointF[] sideleft = { y1, y2, y3, y4 }; //... для второй graphix.FillPolygon(fill2, sideleft); PointF[] sideright = { z1, z2, z3, z4 }; //... и для третьей graphix.FillPolygon(fill3, sideright); } private void timer1_Tick(object sender, EventArgs e) { sides(); //инициализируем функцию рисования сторон куба step++; if (step >= 0) //первой двигается третья сторона { parameter3 += (float)-4; if (step >= 20) //здесь она останавливается { parameter3 -= (float)-4; if (step >= 70) //тут снова продолжает движение, но в обратную сторону { parameter3 += (float)4; if (step >= 89) //тут она останавливается в последний раз { parameter3 -= (float)4; if (step >= 139) //на этом шаге сторона отрисовывается заново //чтобы по ней "не прошла" вторая сторона и первая { PointF z1 = new PointF(210 + parameter3, 75 - parameter3); PointF z2 = new PointF(286 + parameter3, 149 - parameter3); PointF z3 = new PointF(286 + parameter3, 273 - parameter3); PointF z4 = new PointF(210 + parameter3, 200 - parameter3); PointF[] sideright = { z1, z2, z3, z4 }; graphix.FillPolygon(fill3, sideright); } } } } } if (step >= 20) //движение стороны стартует сразу после остановки третьей { parameter2 += (float)-4; if (step >= 39) //движение прекращается, и сторона отрисовывается снова { parameter2 -= (float)-4; PointF y1 = new PointF(134 - parameter2, 273 - parameter2); PointF y2 = new PointF(210 - parameter2, 200 - parameter2); PointF y3 = new PointF(210 - parameter2, 75 - parameter2); PointF y4 = new PointF(134 - parameter2, 149 - parameter2); PointF[] sideleft = { y1, y2, y3, y4 }; graphix.FillPolygon(fill2, sideleft); if (step >= 89) //сторона продолжает свое движение, но в обратную сторону { parameter2 -= (float)-4; if (step >= 108) //сторона останавливается { parameter2 += (float)-4; } } } } if (step >= 39) //сторона начинает свое движение сразу после остановки второй { parameter1 += (float)4; if (step >= 70) //сторона останавливается и прорисовывается снова { parameter1 -= (float)4; PointF x1 = new PointF(134, 273 - parameter1); PointF x2 = new PointF(210, 200 - parameter1); PointF x3 = new PointF(286, 273 - parameter1); PointF x4 = new PointF(211, 348 - parameter1); PointF[] sidebottom = { x1, x2, x3, x4 }; graphix.FillPolygon(fill1, sidebottom); if (step >= 108) //сторона продолжает свое движение, но в обратную сторону { parameter1 -= (float)4; if (step >= 139) //она останавливается { parameter1 += (float)4; } } } if(step == 139) //это последний шаг анимации. здесь обнуляются все счетчики //и анимация начинается снова { parameter1 = 0; parameter2 = 0; parameter3 = 0; step = 0; } } pictureBox1.BackgroundImage = bitmap; //отображение битмэпа на pictureBox1 } } }
Прикрепленный файл | Размер |
---|---|
zakharov_demoscene2.zip | 55.52 кб |