После запуска программы в левом углу экрана будет отображен кусочек сыра (рис. 11.2).
Рис. 11.2. Вывод изображения на экран
Создание анимации
Теперь нужно научиться перемещать объект по экрану. Если это делать достаточно быстро, то у пользователя создается ощущение непрерывного воспроизведения анимации. Для этого следует создать метод
updatePositions
, который позволит перемещать изображение. Пока ограничимся движением вниз и вправо. Соответствующий код приведен в листинге 11.4.
Листинг 11.4
/// <summary>
/// Координата X для рисования сыра
/// </summary>
private int cx = 0;
/// <summary>
/// Координата Y для рисования сыра
/// </summary>
private int cy = 0;
private void updatePositions {
cx++;
cy++;
}
Переменные
cx
и
cy
содержат текущие координаты кусочка сыра. Меняя значения этих координат, можно управлять расположением изображения на экране. Теперь нужно переписать код для события
Form1_Paint
, как это показано в листинге 11.5.
Листинг 11.5
private void Form1_Paint(object sender,
System.Windows.Forms.PaintEventArgs e) {
// Текущая позиция сыра
e.Graphics.DrawImage(cheeseImage, cx, cy);
}
Теперь при каждом вызове метода
Paint
программа перерисовывает изображение сыра в указанном месте. Но программа должна самостоятельно перемещать изображение через определенные
промежутки времени. Также нужно иметь возможность управлять скоростью перемещения картинки. Для этой задачи подойдет объект
Timer
. Соответствующий элемент нужно добавить на форму.
Следует помнить, что во время работы таймера смартфон не может использовать сберегающий энергорежим, так как устройство считает, что программа находится в активном состоянии, даже если она свернута. Это негативно влияет на работу аккумуляторов, сокращая срок работы без подзарядки. Поэтому нужно останавливать таймер, когда программа работает в фоновом режиме, и включать его снова при активации приложения.
Но вернемся к настройкам таймера. Интервал срабатывания таймера должен составлять 50 миллисекунд, а свойство
Enabled
должно получить значение
False
. Когда таймер будет включен, код в методе
Tick
будет срабатывать 20 раз в секунду. При создании таймера нельзя для свойства
Enable
устанавливать значение True, так как метод
timer1_Tick
попытается отобразить изображения до того, как они будут загружены. Включать таймер можно только тогда, когда все необходимые картинки будут загружены, иначе программа выдаст сообщение об ошибке. В нашем примере таймер активируется в конструкторе формы после загрузки изображения сыра, как это показано в листинге 11.6.
Теперь при запуске программы конструктор загружает картинку и включает таймер.
Настало время создать код для события
Tick
. Система перерисовывает содержимое экрана только при определенных условиях. Мы можем заставить систему перерисовать экран при каждом изменении местоположения картинки с помощью метода
Invalidate
. Таким образом, через определенные промежутки времени приложение меняет координаты изображения и обновляет экран, чтобы пользователь увидел картинку на новом месте. Соответствующий код приведен в листинге 11.7.
После запуска программы кусочек сыра по диагонали переместится в правый нижний угол экрана. Когда изображение достигнет края экрана, оно продолжит свое движение и скроется. При движении изображение сыра немного мерцает, что очень раздражает всех пользователей. В дальнейшем этот недостаток будет исправлен.