- •Принципы модульного программирования
- •1. Процедуры
- •1.1.Пример программы с процедурой
- •1.2. Расположение процедур в программе
- •2. Функции
- •2.1. Пример программы с функцией
- •3. Внешние процедуры и функции
- •3.1. Модули пользователей
- •Сложные типы данных, применяемые в Паскале
- •1. Множества
- •1.1. Примеры программ с использованием множеств
- •2. Записи
- •2.1.Пример программы обработки записей
- •Файлы и наборы данных
- •1.Текстовые файлы
- •1.1. Создание текстового файла
- •1.2. Работа с существующим текстовым файлом
- •2. Последовательные файлы
- •2.1.Примеры программ с файлами, содержащими данные простого типа
- •2.2.Работа с файлами, содержащими данные сложного типа
- •2.2.1. Создание последовательного файла
- •2.2.2. Работа с файлом filan
- •3. Файлы с произвольным (прямым) доступом
- •3.1. Создание файла с прямым доступом
- •3.2. Работа с файлом: поиск и коррекция записей
- •3.3. Упорядочение записей в файле
- •3.4. Удаление записей из файла
- •3.5. Вставка записей в файл
- •Динамическое распределение памяти. Указатели и списки
- •1. Использование указателей. Списки
- •2. Очереди
- •2.1. Очередь типа Lifo
- •2.2. Очередь Fifo
- •Стандартные модули Турбо Паскаля
- •Модуль Crt
- •Модуль dos
- •Модуль Graph
- •1. Инициирование графического режима
- •2. Вывод текста (надписей) в графическом режиме
- •3. Вывод точек на экран
- •4. Построение графических изображений
- •5. Запоминание и вывод изображений
- •Библиографический список
- •Содержание
- •Процедуры 3
- •2. Функции 12
5. Запоминание и вывод изображений
Имеется возможность запоминать двоичный образ экрана в памяти ЭВМ и выдавать его на экран. Таким образом создается мультипликация. Для этого используются следующие процедуры и функции модуля Graph:
1) ImageSize (X1,Y1,X2,Y2:Word): Word; - Функция, которая определяет размер блока памяти в байтах для сохранения двоичного образца прямоугольной области экрана с координатами левого верхнего (X1,Y1) и правого нижнего (X2,Y2) углов.
Пример.
Size: = ImageSize (1,1,100,50);
2) GetMem(Var p: Pointer;размер: Word);
Эта процедура создает динамическую переменную указанного размера и помещает ее адрес в переменную-указатель р. Maксимальный размер блока равен 64 Кбайт. Указатель Р^ хранит начальный адрес выделенной области.
Пример.
GetMem (P, Size); – выделена область для образа размером
Size из предыдущего примера.
3) GetImage(X1,Y1,X2,Y2: Word; Var указатель);
Сохраняет в буфере двоичный образ заданной области экрана (область задается координатами (X1,Y1) и (X2,Y2) ). Адрес области памяти записывается в указателе Р^.
Пример.
GetImage (1,1,100,50, P^);
4) PutImage(X,Y: Word; Var указатель^ ; двоичный_оператор:Word);
Из буфера в заданную область экрана выводится двоичный образ.
Область экрана задается координатами (X,Y) – верхний левый угол. Двоичный оператор определяет, как будет осуществляться вывод на экран двоичного образа. Он может иметь следующие значения:
NormalPut=0; - нормальное (обычное) изображение
XOrPut=1; - обратное изображение (цвета фона и рисунка противо положные), используется для стирания
OrPut=2;
........
NotPut=4; - негативное изображение
Пример.
PutImage(20,10,P^,NotPut);
Пример.
Составить программу, которая передвигает горизонтально по экрану круг радиуса 20 (пикселей).
Алгоритм
1.1. Задать драйвер и режим
1.2. Инициировать Graph
2. Если Ошибка=GrOk то
2.1. Очистить экран
2.2. Задать тип и цвет линии
2.3. Нарисовать и закрасить круг
2.4. Задать границы области, которую нужно сохранить,
например: x1=120; y1=90; x2=190; y2=150
2.5. Сохранить образ
2.6. Повторять
а) Задержать вывод;
б) Стереть изображение;
в) Изменить координату х1, например: х1=х1+10;
г) вывести изображение
Пока не нажата клавиша
2.7. Закрыть Graph
3. Закончить.
Программа, которая реализует описанный алгоритм приведена ниже.
Program MoveCircle;
Uses
Crt,Graph;
Var
p:pointer;
Size: Word;
Er,Gd,Gm:Integer;
x1,y1,x2,y2:Integer;
Begin
Gd:=Detect;
Gm:=VgaHi;
InitGraph(Gd,Gm,'');
Er:=Graphresult;
If Er=GrOk then
Begin {Графика}
SetBkColor(Blue);
Cleardevice;
Setcolor(Red);
SetlineStyle(0,0,3);
Circle(150,120,20);
SetFillStyle(8,Yellow); { штриховка ххх желтым }
{ заштриховать до красного }
FloodFill(150,120,Red);
{ координаты сохраняемой области }
x1:=120; y1:=90;
x2:=190; y2:=150;
{Сохранение образа}
Size:=ImageSize(x1,y1,x2,y2);
GetMem(p,Size);
GetImage(x1,y1,x2,y2,P^);
Repeat
Delay(50);
{Стираем старое изображение}
PutImage(x1,y1,P^, XorPut);
{Перемещение круга}
x1:=x1+10;
PutImage(x1,y1,P^, NormalPut);
Until KeyPressed; { Останов изображения }
CloseGraph;
End
Else
Writeln('Ошибка графики',Er);
Readln;
End.
Имитация более сложного движения предполагает перемещение не только самого объекта, но и его частей (рук, ног, глаз и т.д.). Такое движение можно изобразить с помощью нескольких рисунков. Каждый из этих рисунков соответствует определенному положению движущейся части. Для имитации движения необходимо организовать цикл, в котором осуществляется поочередный вывод и стирание указанных рисунков с соответствующим изменением координат выводимых областей. При этом получится маленький мультфильм.
