§ 17. Анимация
Сайт: | Профильное обучение |
Курс: | Информатика. 11 класс (Повышенный уровень) |
Книга: | § 17. Анимация |
Напечатано:: | Гость |
Дата: | Понедельник, 6 Май 2024, 06:53 |
17.1. Компонент Timer
Компонент таймер — Timer позволяет задавать в приложении интервалы времени. На панели компонентов System компонент таймер изображен в виде , имя объекта Timer. Компонент Timer, помещенный на форму, получает имя TimerN, где N — номер 1, 2, 3… (пример 17.1). Таймер является не визуальным компонентом, который можно разместить в любом месте формы. Таймер находит многочисленные применения: управление мультипликацией, включение хранителя экрана, задание времени на ответ в обучающих программах. Свойства компонента приведены в примере 17.2. Для таймера доступно единственное событие — OnTimer. В обработчике этого события записываются необходимые команды. Событие наступает по истечении реального времени эквивалентного значению свойства Interval для таймера. До тех пор, пока таймер не будет выключен, это событие будет наступать вновь и вновь. Пример 17.3. Создать приложение, позволяющее вводить текущее время каждую секунду. Этапы выполнения задания
|
Пример 17.1. Компонент Timer на форме: Пример 17.2. Свойства компонента Timer:
Пример 17.3. Форма на этапе проектирования: Обработчики события OnClick для компонентов Button1 и Button2.
Обработчик события OnTimer.
Работающее приложение: Для вывода времени можно воспользоваться другой функцией[1] [1] Со значениями параметров этой функции можно познакомиться в приложении FormatDateTime("hh:nn:ss",Time()) Эта функция позволяет изменить формат вывода даты/времени. Например, для того чтобы вывести время так: нужно использовать функцию со следующими параметрами: FormatDateTime("dddd, dd mmmm yyyy, Время срабатывания таймера изменить на 100. |
17.2. Простейшая анимация
Из курса информатики 8 класса вам известно, что выделяют два способа создания компьютерной анимации: покадровая и расчетная (пример 17.4). При создании покадровой (традиционной, простейшей) анимации прорисовываются все фазы движения объекта. При расчетной анимации прорисовываются только отдельные кадры, в которых объект располагается в начале движения (или в начале и конце движения), изображения в остальных кадрах (промежуточных) строятся с помощью компьютерных программ. Эффект движения объекта появлялся в результате быстрой смены кадров на экране. Используя компонент таймер, можно создать простейшую анимацию в среде C++Builder. Для этого нужно:
Пример 17.5. Создать секундомер с движущейся секундной стрелкой. Этапы выполнения задания
|
Пример 17.4. Способы создания компьютерной анимации: Пример 17.5. Форма на этапе проектирования: Переменные x, y, x_0, y_0 типа int и переменные ang и pi типа double описаны как глобальные. Обработчик события OnClick для компонента Button1.
Обработчик события OnCreate для формы.
Обработчик события OnTimer для таймера.
Работающее приложение: |
17.3. Анимация движения
Для создания анимации движения достаточно загрузить изображение в Image и для каждого срабатывания таймера менять координаты верхнего левого угла компонента. Для того чтобы объект двигался горизонтально, достаточно менять только значение координаты х. Для организации движения по более сложным траекториям необходимо вычислять значения координат по формулам. Зависимости могут быть функциональными (значение y зависит от значения х) или параметрическим (значения как x, так и y зависят от значений параметра t). Пример 17.6. Создать проект, в котором самолет будет пролетать над городом. При удалении самолет должен уменьшаться. Этапы выполнения задания
|
Пример 17.6. Форма на этапе проектирования: Переменные x_plane, y_plane, w, h типа int описаны как глобальные. Обработчик события OnClick для компонента Button1.
Обработчик события OnCreate для формы.
Обработчик события OnTimer для таймера.
Работающее приложение (в разные моменты времени): Если при работе приложения возникает мерцание, то необходимо установить значение true для свойств формы AlphaBlend и DoubleBuffered. |
17.4. Фрагменты изображений
Мерцание, которое можно было наблюдать в примере 17.6 возникает вследствие того, что изображение приходится перерисовывать на форме при каждом срабатывании таймера. Чем больше будут размеры движущегося объекта, тем сильнее будет мерцание. Использование свойств формы AlphaBlend и DoubleBuffered не всегда дает результат. Для организации анимации движения можно использовать битовые образы, которые были рассмотрены в §14. Для вывода битового образа на Image можно использовать разные методы (пример 17.7). Использование метода Draw было рассмотрено в §14. Для применения других методов необходимо выделять на рисунке прямоугольную область. Переменные Pr1 и Pr2 из таблицы примера 17.7 описаны типом TRect. Тип TRect — это структура с 4 полями (Left, Top, Right, Bottom), которая используется для хранения верхней левой и нижней правой вершин прямоугольника. Задавать значения можно непосредственным присваиванием значений или с помощью функций Rect или Bounds (пример 17.8). Пример 17.9. Изменить проект из примера 14.5 так, чтобы животных можно было рисовать в выбранном масштабе. Этапы выполнения задания
При использовании метода CopyRect можно копировать прямоугольную область, находящуюся на одной канве, в прямоугольную область, находящуюся на другой канве (пример 17.10). Если размеры прямоугольников совпадают, то получаем точную копию. Если размер источника меньше или больше, то копия масштабируется так, чтобы вписаться в прямоугольник (пример 17.11). Прозрачность фона при этом не поддерживается. При использовании метода CopyRect изображения можно выводить, отразив их слева-направо или сверху-вниз. Для этого нужно заменить значения полей в структуре, описывающей прямоугольник: //сверху вниз При необходимости можно изменить все четыре значения — в этом случае получим зеркальное отображение рисунка. В примере 17.12. изображения копировались с битового образа Pict1 в битовый образ Pict2 для того, чтобы можно было затем вывести изображение с прозрачным фоном. [1] Иногда необходимо отнять 1, поскольку точка, описывающая нижний правый угол, не принадлежи области копирования. Вследствие чего, при добавлении прозрачности, может оставаться белая полоса толщиной в 1 пиксель. |
Пример 17.7. Методы вывода битового образа (Ris1):
Пример 17.8. Определение прямоугольной области:
Пример 17.9. Форма на этапе проектирования: Обработчик события OnCreate для формы.
Обработчик события OnClick для компонента Button1.
Обработчик события OnMouseDown для компонента Image1.
Работающее приложение: Пример 17.10. Формат команды CopyRect: Пример 17.11. Использование метода CopyRect: Пример 17.12. Копирование с отражением: Обработчик события для кнопки:
|
17.5. Анимация движения с использованием битовых образов
Использование битовых образов позволяет обходиться только одним компонентом Image на форме. При срабатывании таймера объект, хранящийся в виде битового образа, будет прорисовываться поверх фона. Однако прорисовка поверх имеющегося изображения испортит рисунок фона. Поэтому перед прорисовкой следует скопировать ту часть фона, поверх которой будет выведен объект, в битовый образ. А при следующем срабатывании таймера следует восстановить фон. Алгоритм для реализации такой анимации будет следующим:
Пример 17.13. Создать проект, в котором луна будет летать вокруг земли. Этапы выполнения задания
Пример 17.14*. Создать проект в котором бабочка будет летать вокруг цветка по траектории в виде астроиды и менять свое направление полета. Этапы выполнения задания
|
Пример 17.13. Форма на этапе проектирования: Глобальные переменные:
Обработчик события OnClick для компонента Button1.
Обработчик события OnCreate для формы.
Обработчик события OnTimer для таймера.
Работающее приложение: Пример 17.14. Обработчик события OnTimer для таймера.
Работающее приложение. |
17.6. Спрайтовая анимация
Используя битовые образы, можно создавать спрайтовую анимацию. Под спрайтом понимают некоторый графический объект, который может перемещаться по экрану без искажения заднего плана. Спрайты являются одним из самых популярных способов создания больших и сложных сцен, так как позволяют манипулировать и управлять каждым изображением в отдельности. Спрайты использовались при создании анимации в примерах 17.13 (луна) и 17.14 (бабочка). В этих примерах спрайт содержал фиксированное изображение. Современным подходом к применению спрайтов в анимации является использование раскадровок (spritesheet — атлас спрайтов) — графических файлов, содержащих несколько фаз движения какого-либо объекта (пример 17.15). Быстрая смена отдельных кадров позволяет создать иллюзию движения. Такую анимацию называют спрайтовой. Удобно использовать раскадровки, в которых все кадры имеют одинаковую ширину (высоту). Алгоритм создания анимации с использованием атласа спрайтов будет аналогичен алгоритму, рассмотренному в примере 17.5:
Пример 17.16. Создать проект, в котором бабочка будет летать вокруг цветка. Для полета бабочки использовать спрайт с раскадровкой. Этапы выполнения задания
|
Слово «спрайт» было придумано в 1970-е годы сотрудником компании Texas Instruments: их новая микросхема TMS9918 могла аппаратно отображать небольшие движущиеся картинки поверх неподвижного фона. Пример 17.15. Примеры раскадровок[1]: [1] Изображения бесплатных раскадовок взяты с сайта https://ru.freepik.com/ Пример 17.16. Раскадровка бабочки (первые четыре кадра): Описание переменных:
Обработчик события FormCreate для формы.
Обработчик события OnTimer для таймера:
|
Вопросы к параграфу
1. Какой компонент используется для отсчета времени? 2. Как запрограммировать простейшую анимацию? 3. Какая функция позволяет скопировать фрагмент изображения с одной канвы на другую? 4. Как осуществляется отражение изображений? 5. Что такое спрайт? 6. Как организована спрайтовая анимация? |
Упражнения
1. Добавьте в проект из примера 17.5 минутную стрелку (для этого удобно использовать еще один компонент timer, стрелку рисовать на отдельном компоненте Image). Добавьте кнопку «Стоп» для остановки таймера.
2. Создайте анимацию движения шарика (мяча) в прямоугольной «коробке». Удары о стенку абсолютно упругие. Шарик можно прорисовывать при каждом срабатывании таймера или загрузить его в отдельный компонент Image. *Добавьте текстовые поля для ввода начального положения шарика (мяча) и угла (угол между левой стенкой коробки и линеей траетории движения).
3. Создать проект, в котором над изображением будут производиться операции отражения и масштабирования.
4. Создайте проект, в котором необходимо анимировать падение яблока с башни. Движение осуществляется по параболе. Яблоко увеличивается при приближении к земле.
5. Создайте проект с использованием спрайтовой анимации. Фон и персонажей выберите самостоятельно.