Читайте также:
|
|
Кроме процедур, которые заставляют Паскаль что-либо сделать, в модуле Graphимеются функции, которые могут сообщать программисту ту или иную информацию. Вот некоторые из них:
Функция | Смысл |
GetMaxX:Integer | Выдает максимально возможную горизонтальную координату экрана |
GetMaxY:Integer | Выдает максимально возможную вертикальную координату экрана |
GetPixel(x,y:Integer):Word | Выдает номер цвета пиксела с координатами x и y. |
А вот еще процедуры рисования:
Процедура | Смысл |
Arc(x,y:Integer; fi1,fi2,r:Word) | Рисует дугу окружности с центром в точке x,y и радиусом r. Дуга начинается от угла fi1 градусов и кончается углом fi2 градусов. |
PieSlice(x,y:Integer; fi1,fi2,r:Word) | Закрашенный сектор круга. Дуга сектора определяется так же, как в процедуре Arc. Цвет и стиль заливки определяются процедурой SetFillStyle. |
FillEllipse(x,y:Integer; rx,ry:Word) | Закрашенный эллипс с центром в точке x,y и радиусами rx,ry. Цвет и стиль заливки определяются процедурой SetFillStyle. |
Sector(x,y:Integer; fi1,fi2,rx,ry:Word) | Закрашенный сектор эллипса. Опирается на дугу эллипса с центром в точке x,y и радиусами rx,ry. Дуга начинается от угла fi1 градусов и кончается углом fi2 градусов. |
Bar(x1,y1, x2,y2:Integer) | Закрашенный прямоугольник с противоположными углами в точках (x1,y1) и (x2,y2) |
Bar3D(x1,y1, x2,y2:Integer; tol:Word; top:Boolean) | Трехмерный параллелепипед, обращенный к нам прямоугольной гранью с противоположными углами в точках (x1,y1) и (x2,y2). Толщина параллелепипеда – tol. Если top равно TopOff, то параллелепипед – без верха, если top равно TopOn, то – с верхом. |
Копирование и движение областей экрана
До сих пор мы заставляли двигаться лишь простые объекты: окружности, квадраты, линии. Если же мы хотим заставить двигаться что-нибудь посложнее, например, снеговика из 9.3, то нам придется изрядно потрудиться. Чтобы не рисовать и не стирать по-очереди все элементы, из которых состоит снеговик, мы можем использовать процедуры GetImage и PutImage, которые позволяют копировать любую прямоугольную область экрана целиком в другое место экрана.
Пример 1. Нарисуем в левом верхнем углу экрана четыре окружности, а затем скопируем получившиеся «очки» в правый нижний угол.
USES Graph;
VAR Gd, Gm: Integer;
P: pointer;
Size: Word;
Begin
Gd:= 0; InitGraph(Gd, Gm, 'с:\tp\bgi');
SetLineStyle(0,0,Thickwidth);
{Рисуем очки:}
Circle(50,100,20); Circle(50,100,15);
Circle(90,100,20); Circle(90,100,15);
{В целях наглядности нарисуем также диагональ экрана:}
Line(0,0,640,480);
Size:= ImageSize(10,60,120,140);
GetMem(P, Size);
GetImage(10,60,120,140,P^);
ReadLn;
PutImage(500,400, P^,0);
ReadLn;
CloseGraph
End.
Пояснения: Чтобы скопировать область экрана, Паскаль должен сначала ее запомнить в оперативной памияти. Выберем мысленно прямоугольник, охватывающий объект, предназначенный для копирования. В нашем случае подойдет прямоугольник между точками (10,60) и (120,140). Чтобы знать, сколько памяти отвести под запоминание области, компьютер должен знать размер изображения в байтах. Этот размер сообщает функция ImageSize. Поскольку размер этот может оказаться большим, то запоминать изображение лучше всего в куче. Отводит место в куче процедура GetMem. Вот ее вызов - GetMem(P, Size). P – так называемый указатель на место в памяти, предназначенное для запоминания. Указатели – это новый для нас тип данных. Останавливаться на них я не буду, скажу только, что они очень похожи на ссылки. Запоминает область процедура GetImage, параметр которой P^ имеет значением изображение этой области. Процедура PutImage помещает это изображение в точно такой же прямоугольник экрана с верхним левым углом в точке (500,400).
Если вы уже запустили эту программу, то могли видеть, что GetImage прихватил в выделенном прямоугольнике и кусок диагонали, а PutImage добросовестно поместил на экран все, что прихватил GetImage, начисто стерев все, что там было раньше. Ответственность за это несет последний параметр PutImage, равный у нас нулю. Для того, чтобы новое изображение не затирало старое, нужно использовать вместо нуля двойку.
Задание 130: Нарисуйте шеренгу из десятка снеговиков.
Пример 2. Попробуем двигать наши очки слева направо.
USES Graph,crt;
VAR x,Gd, Gm: Integer;
P: pointer;
Size: Word;
Begin
Gd:= 0; InitGraph(Gd, Gm, 'с:\tp\bgi');
SetLineStyle(0,0,Thickwidth);
{Рисуем очки:}
Circle(50,100,20); Circle(50,100,15);
Circle(90,100,20); Circle(90,100,15);
{Рисуем диагональ:}
Line(0,0,640,480);
Size:= ImageSize(10,60,120,140);
GetMem(P, Size);
GetImage(10,60,120,140,P^);
{Начинаем движение:}
x:=20;
while x<300 do begin
PutImage(x, 150, P^,1);
Delay(40);
PutImage(x, 150, P^,1);
x:=x+1;
end {while};
CloseGraph
End.
Пояснение: Чтобы нарисовать очки в каком-то месте, а потом их стереть, достаточно два раза подряд употребить оператор PutImage(x, 150, P^,1). Обратите внимание, что изображение прямой, по которому прошлись очки, не затерлось. Все это - результат удивительного действия константы 1. Но чтобы понять механизм ее действия, нужно знать азы алгебры логики, которые, к сожалению, у меня нет времени излагать.
Задание 131: Пусть два снеговика идут друг другу навстречу.
Дата добавления: 2015-11-14; просмотров: 40 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Вставка в программу фрагментов из других программных файлов | | | Управление цветом в текстовом режиме(модуль CRT) |