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


 

 

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


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

 

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

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

 

Далее определяем параметр 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) - " НЕ" (замена изображения на экране инверсным изображением из буфера).

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


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

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


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

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

AndPut00000100 00000001 00000000 = $0 черный

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

 

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

 

 

Освобождение(очистка) участков памяти размером "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); { линии }

       
   


{ первый образ }


PieSlice(60, 10, 0, 360, 10);

FillEllipse(60, 40, 10, 20);

Line(60, 60, 60, 100);

 

{ второй образ }

GetMem(P1, Size);{ P1 - указатель адреса для хранения первого образа }

GetImage(0, 0, 20, 100, P1^);{P1^ - содержимое (двоичный код) образа }

 

GetMem(P2, Size);{ P2 - указатель адреса для хранения второго образа }

GetImage(50, 0, 70, 100, P2^);{P2^ - содержимое (двоичный код) образа }

 

x:=0; y:=200;{ координаты начальной точки }

Readln; ClearDevice; Line( 0, 300, 600, 300); { "дорога" }

 

Repeat{ имитация движения чередованием образов со смещением }

PutImage(x, y, P1^, 1); delay(50); PutImage(x, y, P1^, 1);

x:=x+10;{ смещаем позицию на полшага }

PutImage(x, y, P2^, 1); delay(50); PutImage(x, y, P2^, 1);

x:=x+10

Until x > GetmaxX - 20;{ достижение края }

 



Дата добавления: 2016-06-29; просмотров: 1366;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.012 сек.