Анимация-шутка «Заход Луны»

Иногда бывает полезна психологическая разгрузка. Добавим в класс Form1 метод, который будет вызываться при возникновении некоторого события, например, клика на форме. Тогда в течении некоторого времени в окне формы можно будет наблюдать заход Луны. Первая реакция пользователя — компьютерный вирус. Однако все последствия от его действия — перекраска фона формы (добавка двух операторов позволит избежать и этих последствий).

Идея алгоритма состоит в том, чтобы внутри обработчика старшего события (клика на форме) выполнялась анимация (заход Луны) в течение нескольких секунд. Для этого удобно использовать динамически создаваемый таймер, задающий частоту кадров анимации (как в примере с бильярдными шарами). Каждое срабатывание таймера (такт) назовем младшим событием. Выключение таймера будет выполнено через заданное число тактов.

Младшее событие timer.Tick свяжем через обобщенный делегат EventHandler с лямбда-выражением (разновидность анонимной функции).

Тогда вместо объявления функции обработчика этого события мы можем использовать следующую конструкцию:

timer.Tick += new EventHandler((o, ev) =>
{
// обработка младшего события — составное лямбда-выражение
});

Здесь «=>» — лямбда-оператор, связывающий анонимный метод (функцию) с лямбда-выражением.

Обработка старшего события (клика на форме)зададим следующим образом:

1) Создаем объект timer через конструктор класса Timer. Задаем свойство Interval = 40 мс (25 кадров в секунду).

2) Задаем счетчик перемещений и максимальное число кадров.

3)Задаем начальное положение и диаметр шара — Луны.

4) Задаем настройки графики: холст, его очистку, стиль и цвет кистей для рисования Луны и фона.

5) Рисуем шар в начальном положении.

6) Внутри скобок {  } :
timer.Tick += new EventHandler((o, ev) =>
{
удаляем шар, изменяем его координаты, рисуем шар снова; считаем число перемещений, если оно максимальное, то останавливаем таймер.
}
);

7) Запускаем таймер.

Ниже приведен текст метода Form1_Click() с использованием этой конструкции:

private void Form1_Click(object sender, EventArgs e)
{
   Timer timer = new Timer();  // объект - таймер
   timer.Interval = 40;        // тик - каждые 40 миллисекунд
   int count = 0;              // счетчик перемещений
   int max = 150;              // их максимальное число
   int x = 20;                 // начальные
   int y = 20;                 // координаты
   int d = 60;                 // диаметр шара
   Graphics g = this.CreateGraphics();  // объект - на форме
   g.Clear(Color.DarkCyan);             // очистка цветом фона
   SolidBrush br = new SolidBrush(Color.Yellow);  // задание кисти
   SolidBrush brf = new SolidBrush(Color.DarkCyan);  // задание фона
   g.FillEllipse(br, x, y, d, d);       // заливка - начало
// Каждые 40 мс будет удаляться и рисоваться новый шарик, остановка через 150 раз
   timer.Tick += new EventHandler((o, ev) =>
   {
      g.FillEllipse(brf, x, y, d, d);
      x += 5;
      y += 2;
      g.FillEllipse(br, x, y, d, d);
      count++;
      if (count == max)
         timer.Stop();
   }
   );
   timer.Start();   // запустили, остановится сам
}

Результат: Кликнув 3 раза на форме, вы сможете наблюдать заход  3-х Лун.

3луны

Оставьте комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *