Часть XII. Методология анимации объектов
Глава 52. Оглавление системы программ для анимации объектов
Алгоритм и проект системы
Выше мы условно приняли, что если в приложении фазы движения объектов спроектированы и выводятся на экран без использования графических файлов, то такое движение называется анимацией (или эффектом анимации).
Как уже отмечалось, например, изменение во времени внешнего вида формы и какого-либо элемента управления, к примеру, кнопки, на форме мы считаем анимацией. Анимация во многих случаях требуется в учебе и на практике, чтобы показать какую-нибудь конструкцию в работе (во времени) или показать какой-либо процесс, например, изготовления изделия (детали, вещи) в динамике, т.е. по мере поэтапного изготовления изделия во времени. Это позволяет не только наглядно увидеть происходящее, но и выявить ошибки (недостатки) проектирования с целью последующей доработки этого процесса до наиболее рационального (оптимального).
Следовательно, методика разработки анимациизаключается в написании программы на основе использования стандартных функций из библиотеки классов какой-либо платформы визуального программирования и на основе математических зависимостей (без рисования последовательных фаз изменения объектов и без сохранения этих фаз в виде графических файлов).
Для разработки анимации в среде Visual C# имеется несколько вариантов применения элементов управления и программ. Например, один из вариантов использует элемент управления StatusBar, внутри которого располагают панели, на которых размещают уже готовые анимационные рисункииз класса StatusBar. Другой вариант основан на применении класса Matrix(пространства имен System.Drawing. Drawing2D), который (при помощи своих методов) производит преобразования (перемещение, поворот, растяжение и сжатие) какой-либо геометрической фигуры. Все варианты, естественно, используют компонент Timer, при помощи которого задаются интервалы времени изменения положения объекта.
Мы закончили главу с методикой проектирования первой формы с оглавлением нашей персональной (или корпоративной) системы анимации.
Теперь приступаем к разработке раздела, согласно оглавлению системы, для решения конкретных анимационных задач на следующих формах.
Глава 53. Варианты часов с цифровой индикацией, индикаторами прогресса и датой
Листинг 53.1. Метод для вывода короткого времени, без секунд.
private void button5_Click(object sender, EventArgs e)
{
statusBarPanel1.Text =
System.DateTime.Now.ToShortTimeString();
}
Для вывода короткой даты (одними цифрами) при помощи метода ToShortDateString дважды щелкаем вторую кнопку Start на Form3 в режиме редактирования (рис. 53.4). Появляется файл Form3.cs с шаблоном, который после записи одной строки нашего кода принимает следующий вид.
Листинг 53.2.Метод для вывода короткой даты.
private void button6_Click(object sender, EventArgs e)
{
statusBarPanel2.Text =
System.DateTime.Now.ToShortDateString();
}
Тот же самый шаблон для первой кнопки Start после записи одной строки кода (с целью вывода длинного времени, с секундами, при помощи метода ToLongTimeString) принимает следующий вид.
Листинг 53.3.Метод для вывода длинного времени, с секундами.
private void button5_Click(object sender, EventArgs e)
{
statusBarPanel1.Text =
System.DateTime.Now.ToLongTimeString ();
}
Листинг 53.4.Метод для вывода длинной даты.
private void button6_Click(object sender, EventArgs e)
{
statusBarPanel2.Text =
System.DateTime.Now.ToLongDateString ();
}
Листинг 53.5.Метод для вывода коротких значений часов и даты.
private void timer1_Tick(object sender, EventArgs e)
{
statusBarPanel1.Text =
System.DateTime.Now.ToShortTimeString();
statusBarPanel2.Text =
System.DateTime.Now.ToShortDateString();
}
Листинг 53.6.Метод для вывода длинных значений часов и даты.
private void timer1_Tick(object sender, EventArgs e)
{
statusBarPanel1.Text =
System.DateTime.Now.ToLongTimeString();
statusBarPanel2.Text =
System.DateTime.Now.ToLongDateString();
}
Листинг 53.7.Код для вывода времени и даты по второму варианту.
label1.Text = System.DateTime.Now.ToLongTimeString();
label2.Text = System.DateTime.Now.ToLongDateString();
Листинг 53.8.Метод для вывода значений секунд, минут и часов.
private void timer1_Tick(object sender, EventArgs e)
{
DateTime currentTime = DateTime.Now;
int seconds = currentTime.Second;
int minutes = currentTime.Minute;
int hours = currentTime.Hour;
progressBar1.Value = seconds;
progressBar2.Value = minutes;
progressBar3.Value = hours;
label1.Text = seconds.ToString();
label2.Text = minutes.ToString();
label3.Text = hours.ToString();
}
Продолжим (в следующей главе) проектирование более сложных анимационных программ (согласно оглавлению системы).
Глава 54. Вращение линии
Листинг 54.1. Код проектирования рисунка.
//Объявляем глобальную переменную для угла "angle"
//и приравниваем ее нулю:
int angle = 0;
private void pictureBox1_Paint(object sender,
PaintEventArgs e)
{
//Объявляем объект myGraphicsPath класса GraphicsPath:
GraphicsPath myGraphicsPath = new GraphicsPath();
//На объекте myGraphicsPath выполняем процедуру
//AddLine для построения линии по двум точкам
//с координатами (29, 29) и (100, 100):
myGraphicsPath.AddLine(29, 29, 100, 100);
//В классе Matrix создаем объект myMatrix
//в виде матицы преобразований:
Matrix myMatrix = new Matrix(1, 0, 0, 1, 1, 1);
//В структуре PointF создаем объект myPointF
//с координатами точки (100, 100);,
//вокруг которой будет вращаться линия:
PointF myPointF = new PointF(100, 100);
//Поворачиваем линию вокруг точки (100, 100)
//на один шаг при помощи метода RotateAt
//класса Matrix:
myMatrix.RotateAt(angle, myPointF);
//Применяем метод Transform класса GraphicsPath
//для трансформирования матрицы myMatrix:
myGraphicsPath.Transform(myMatrix);
//Рисуем на экране трансформированную линию
//черным пером толщиной 3 (Pen(Color.Black, 3)):
e.Graphics.DrawPath(new Pen(Color.Black, 3),
myGraphicsPath);
//Увеличиваем текущий угол поворота линии
//на один шаг, равный 6 градусам:
angle = angle + 6;
//Обнуляем угол поворота линии,
//когда линия сделает полный оборот в 360 градусов:
if (angle == 360) angle = 0;
//Для наглядности внутри квадрата 200x200
//рисуем окружность (типа циферблата часов)
//синим пером толщиной 2 (Pen(Color.Blue, 2),
//внутри которой будет вращаться линия:
e.Graphics.DrawEllipse(new Pen(Color.Blue, 2),
0, 0, 200, 200);
//Рисуем две оси симметрии окружности,
//горизонтальную и вертикальную:
e.Graphics.DrawLine(new Pen(Color.Red, 1),
0, 100, 200, 100);
e.Graphics.DrawLine(new Pen(Color.Red, 1),
100, 0, 100, 200);
}
Листинг 54.2.Код для анимации рисунка.
private void timer1_Tick(object sender, EventArgs e)
{
//Перерисовываем клиентскую область элемента управления
//pictureBox1 через каждый Interval времени:
pictureBox1.Refresh();
}
Напомним, что в этом коде метод Refresh (класса Control) перерисовывает клиентскую область элемента управления (в нашем примере, элемента управления PictureBox) через каждые, заданные нами в таймере, 1000 миллисекунд (1 секунду). За счет этого мы видим поворот стрелки в динамике (во времени).
Таким образом, в этой главе мы разработали методику создания анимации (в комплексе Visual C#) на экране монитора и печати текущего положения анимации на принтере. Теперь по этой методике продолжим разработку следующих форм (согласно оглавлению системы анимации) для проектирования более сложных анимаций (в следующей главе).