- 14 - 3. ЛАБОРАТОРНАЯ РАБОТА "ГРАФИКА И АНИМАЦИЯ" 3.1. Цель работы Ознакомиться с основами модульного программирования, со стандартными модулями CRT и Graph. Спроектировать и отладить программу, использующую графический режим, выводящую анимиро- ванное изображение, построенное с помощью графических примити- вов и управляемое клавиатурой. 3.2. Методические указания к лабораторной работе 3.2.1. Модули в Турбо Паскале Модульное программирование возникло из-за возрастающих объемов и сложности программ и коллективным характером разра- ботки. В настоящее время модуль - независимо разрабатываемая и хранимая, независимо компилируемая и тестируемая программная единица со строго определенными интерфейсами. Модули могут объединяться в различных сочетаниях, что характерно, например, для языка Ада. В Турбо Паскале понятие модуля было введено, начиная с версии 4, что явилось решающим шагом на пути его превращения в язык, пригодный для крупных разработок производственного и коммерческого назначения на современном уровне технологии программирования. Стал возможным современный стиль реализации программных пакетов, легко подключаемых к любой программе. Удалось ослабить ограничение на суммарный объем готовых прог- рамм. В Турбо Паскале подпрограмма является структурным элемен- том программы и не может существовать вне ее. А модуль в Турбо Паскале хранится и компилируется отдельно и представляет собой совокупность (библиотеку) подпрограмм и описаний (константы, типы, переменные), которые используются другими программными единицами. Сам по себе модуль не исполняется. ОБЩАЯ СТРУКТУРА МОДУЛЯ unit <имя модуля> } Заголовок модуля interface <Описания видимых объектов> } Интерфейс implementation <Описания скрытых объектов> } Реализация begin <Операторы инициализации> } Инициализация end. Пример модуля без подпрограмм (нет реализации и инициализации): unit tipsp; interface - 15 - type tukaz=^telem; telem=record inf:integer; sled:tukaz; end; implementation end. Использование модуля Program p; uses tipsp; var perv,tek,posl:tukaz; z:telem; begin ... end. ПОДПРОГРАММЫ В МОДУЛЯХ По аналогии с модулем для любой подпрограммы интерфейс - это ее заголовок, реализация - тело, а инициализация - значе- ния, присваиваемые типизированным константам. Соответственно, в интерфейсной части модуля помещаются ПОЛНЫЕ ЗАГОЛОВКИ процедур и функций, доступных (видимых) для других программ без служебного слова forward. В реализующей части описания подпрограмм СОКРАЩЕННЫЕ ЗАГОЛОВКИ (без списка параметров). Можно использовать и полные заголовки, но тогда они должны полностью совпадать с заголовками в интерфейсной части. Не рекомендуется делать инициирующую часть пустой, лучше ее опустить: пустая часть содержит пустой оператор, которому будет передано управление при запуске программы. Это часто вы- зывает проблемы при разработке оверлейных программ. Таким образом, механизм модулей позволяет скрыть детали реализации тех или иных программных подсистем, предоставив в распоряжение использующих программ строго определенную сово- купность интерфейсных объектов. Если необходимо расширить мо- дуль введением новых процедур или изменить реализацию какойли- бо процедуры и интерфейс модуля не изменился, то такая модифи- кация НИКАК НЕ ОТРАЗИТСЯ на использующих программах. КОМПИЛЯЦИЯ И ИСПОЛЬЗОВАНИЕ МОДУЛЕЙ Принято за правило: имя файла с исходным текстом модуля должно совпадать с именем этого модуля. Фактически компилятор ищет имена файлов, а не имена модулей. Если нужны разные име- на, то используется директива $U с указанием имени файла, нап- ример, uses {$U IMIAF} imiamod; заставляет компилятор искать модуль imiamod в файле IMIAF. - 16 - Результат компиляции исходного текста модуля imiamod.pas - файл imiamod.tpu (Turbo Pascal Unit), при это имя файла бе- рется из имени файла с исходным текстом. Спецификация используемых модулей uses A, B; должна идти непосредственно после заголовка программы или пос- ле служебного слова interface. Правило видимости имен: модуль, указанный первым в спис- ке, образует самый внешний блок программы, т. е. вложенность блоков выглядит так: идентификаторы модуля А идентификаторы модуля В идентификаторы программы При необходимости производится уточнение имен (составное имя как для записей), например, в программе Р передается зна- чение модулю A.X:=round(X); Возможны случаи косвенного использования модулей (через модуль). В спецификации использования необходимо указывать только модули, НЕПОСРЕДСТВЕННО используемые программой. Недопустимо явное или косвенное обращение модуля к самому себе. Если есть операторы раздела инициализации, то они выпол- няются ПЕРЕД началом выполнения программы, в которой использу- ется этот модуль. Если используемых модулей несколько, то их разделы инициализации выполняются в порядке, определенном спе- цификацией использования. 3.2.2. Стандартный модуль Graph Модуль Graph содержит константы, процедуры и функции для управления графическим режимом экрана. Скелет графической программы выглядит следующим образом: после инициализации графического режима (процедура InitGraph) проверяется функция GraphResult, если ошибки нет, то выполня- ется программа в графическом режиме, затем графический режим закрывается (процедура CloseGraph). Для временного перехода в текстовый режим используется процедура RestoreCrtMode, для ус- тановки желаемого графического режима - процедура SetGraphMode. Все изображение в графическом режиме строится из отдель- ных элементов, точек (пикселей pixel), каждая из которых имеет свои координаты и свой цвет. Левый верхний угол экрана имеет координаты (0,0), а максимальные значения координат, которые определяют разрешающую способность графического режима, можно определить с помощью функций GetMaxX и GetMaxY, что удобно при построении изображения в относительных координатах. Для построения изображения используются графические при- - 17 - митивы: точка, линия, окружность, прямоугольник и т.д. Контур- ные изображения могут заливаться определенным цветом. Для анимации (оживления) изображения рисуются сменяющие друг друга кадры. Чтобы не было заметно мелькание изображения, обычно используют две графические страницы: одна (видимая) вы- дается на экран, а в другой (активной) производится построение нового изображения. Затем производится замена страниц. 3.3. Порядок выполнения работы 3.3.1. Ознакомиться с основами модульного программирова- ния, составом стандартных модулей CRT и Graph. 3.3.2. Написать, отладить программу и получить контроль- ный пример, проверяющий все варианты обработки. 3.3.3. В отчет по лабораторной работе включается: постановка задачи с описанием предметной области, струк- тур данных, математической модели; иерархическая схема программы со спецификацией; схема программы по ГОСТ 19.701-90 или структурограмма; текст программы; контрольный пример с распечаткой нескольких экранов. 3.4. Задания В программе должен быть использованы стандартные модули CRT и Graph и один свой модуль. Разрабатываемая программа предназначена для выдачи оживших (анимированных) изображений, которые строятся путем использования графических примитивов в относительных координатах. Движение большинства объектов осу- ществляется слева направо, затем снова повторяется. Движение должно сопровождаться звуком. Программа должна реагировать на следующие управляющие клавиши: F1 - помощь, продолжение - любая клавиша; F2 - пауза (стоп-кадр), продолжение; Space, Enter - старт с исходного положения; стрелка вверх (вниз) - увеличение (уменьшение) объекта; стрелка влево (вправо) - замедление (ускорение) движения; Escape - завершение программы. Варианты: 1). Человек идет. 2). Самолет летит. 3). Вертолет летит. 4). Парашютист спускается. 5). Бомба падает. 6). Мячик отскакивает. 7). Шарик надувается и лопает. 8). Книга перелистывается. 9). Файл копируется (линейка). 10). Часы идут. 11). Сердце бьется. 12). Флаг поднимается и трепещет. 13). Автомобиль едет. 14). Танк ползет. - 18 - 15). Лодка плывет. 16). Сороконожка ползет. 17). Салют. 18). Звезды мерцают, луна плывет. 19). Свеча горит и гаснет. 20). Запуск ракеты. 21). Бросание гранаты, взрыв. 22). Насос накачивает камеру, прокол. 23). Дерево растет. 24). Крот роет землю. 25). Паровозик едет. 26). Снаряд из пушки летит и взрывается. 27). Прыжок с трамплина. 28). Домик строится. 29). Цветок распускается. 30). Детский рисунок: солнце, небо, мама, я. 3.5. Контрольные вопросы 1. Структура модуля. 2. Трансляция модулей. 3. Стандартные модули Турбо Паскаля. 4. Графические адаптеры и режимы. 5. Графические примитивы. 6. Работа с клавиатурой. 7. Программирование звука.