Мультипликация с запоминанием части экрана

 

 

       Прежде чем сохранить фрагмент экрана, под него нужно отвести память, размер (Size) которой определяют с помощью функции:

 


       Size: = ImageSize(X1, Y1, X2, Y2);           {тип Word}

 

Параметры функции ImageSize определяют границу прямоугольной области графического экрана подобно процедуре Rectangle. Функция определяет число байт для хранения этой области. Этот размер можно также вычислить по формуле:

 (X2-X1+1)*(Y2-Y1+1). Размер отводимой памяти должен быть меньше 64 Кбайт.

 

104

       Далее определяем параметр P (типа pointer), который будет содержать начальный адрес области памяти (буфера) размером "Size", отводимый для хранения двоичного образа прямоугольной области экрана процедурой:

                                                          

                                                                                         GetMem(P, Size); 

                                                          

       Сохраняем двоичный образ прямоугольной области в ОЗУ (буфере) процедурой:  

           

                             GetImage(X1, Y1, X2, Y2, P^); 

 

       Сохраненный массив пикселов можно выводить на экран из буфера процедурой:

           

                     PutImage(X, Y, P^, N);

 

Здесь X, Y - позиция вывода верхнего левого угла прямоугольной области,  

                   P^ - обозначает содержимое буфера с начальным адресом "Р",

                   N - режим вывода:

       N = 0  (CopyPut) - замена изображения на экране изображением из буфера. 

       Остальные режимы соответствуют логическим операциям с битами, определяющими цвет пикселов на экране и соответствующих значений цвета пикселов, выводящихся из буфера:

       N = 1  (XorPut) - "исключающее ИЛИ" (результат равен 1, если значения битов различны),

       N = 2  (OrPut) - "ИЛИ" (результат равен 1, если один из битов равен 1),

       N = 3  (AndPut) - " И " (результат равен 1, если оба бита равны 1),

       N = 4  (NotPut) - " НЕ" (замена изображения на экране инверсным изображением из буфера).

       Цвет пикселов изображения из буфера не изменяется, если рисунок выводится в область, залитую фоном. Цвет пикселов изображения из буфера изменяется в соответствии с логическими операциям над битами, определяющими цвет пикселов, если рисунок выводится в область заполненных каким либо цветом фигур. Например, при выводе красного круга на синий прямоугольник результирующий цвет пикселов будет:

 

 


Режим вывода Значения битов, соответствующие цвету пиксела     

                              красный цвет синий цвет  результирующий цвет

XorPut  00000100         00000001        00000101 = $5  фиолетовый

OrPut   00000100          00000001      00000101 = $5 фиолетовый   

AndPut       00000100          00000001       00000000 = $0 черный   

NotPut       00000100                                       $15-$4 = $11 ярко-голубой

 

Вывод в режиме XorPut удобно использовать при создании движущихся изображений, поскольку при первом выводе получаем изображение из буфера, а при втором - восстанавливаем изображение на экране. Для создания движущегося изображения в буфер помещают, как правило несколько различных образов, например, рисунок человечка с различным положением рук и ног. На экран выводится первое изображение в режиме XorPut, затем следует задержка выполнения программы, снова выводится первое изображение в режиме XorPut в том же месте (происходит восстановление изображения на экране), далее (возможно в другой позиции) выводится второе изображение в режиме XorPut и т. д. 

 

 

105

       Освобождение (очистка) участков памяти размером "Size", начиная с адреса, заданного параметром "Р", производится процедурой:

 


                       FreeMem(P, Size); 

 

Значения P и P^ после этого не определены.

 

       Приведем пример программы - мультипликации с использованием процедур GetImage, PutImage, в режиме вывода XorPut:

uses Graph, Crt;

var Gd, Gm, i, j, k, Size, x, y, Xmax, Ymax: Integer; 

  P1, P2: Pointer;                                   { тип указатель }




Begin

Gd:= VGA; Gm:=2; InitGraph(Gd, Gm, 'c:\tp7\bgi');

Size:= ImageSize(0, 0, 20, 100);                            { размер области }

SetLineStyle(0, 0, 3);                             { рисуем толстыми линиями }

           PieSlice(10, 10, 0, 360, 10);          { заполненный круг }

          FillEllipse(10, 40, 10, 20);       { заполненный эллипс }

           Line(8, 60, 0, 100); Line(12, 60, 20, 100); { линии }


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: