Копирование и движение областей экрана

  • docx
  • 06.05.2020
Публикация на сайте для учителей

Публикация педагогических разработок

Бесплатное участие. Свидетельство автора сразу.
Мгновенные 10 документов в портфолио.

0.1. Копирование и движение областей экрана
Иконка файла материала 103.docx

0.1. Копирование и движение областей экрана

До сих  пор мы заставляли двигаться лишь простые объекты: окружности, квадраты, линии. Если же мы хотим заставить двигаться что-нибудь посложнее, например, снеговика из 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:   Пусть два снеговика идут друг другу навстречу.

 


 

Скачано с www.znanio.ru