Ремонт принтеров, сканнеров, факсов и остальной офисной техники


назад Оглавление вперед




[34]

Мультипликация в графическом режиме обеспечивается возможностью запоминать (хранить в ОЗУ) прямоугольные массивы пикселов. Эти массивы можно в дальнейшем выводить в любом месте экрана в нужное время.

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

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

под него нужно отвести память, размер (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, PA);

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

PutImage(X, Y, PA, N);

Здесь X, Y - позиция вывода верхнего левого угла прямоугольной области, PA - обозначает содержимое буфера с начальным адресом "Р", N - режим вывода: N = 0 (CopyPut) - замена изображения на экране изображением из буфера. Остальные режимы соответствуют логическим операциям с битами, определяющими цвет пикселов на экране и соответствующих значений цвета пикселов, выводящихся из буфера:

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

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

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

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


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

Режим вывода

Значения бито] красный цвет

, соответствующ

синий цвет

ие цвету пиксела

результирующий цвет

XorPut OrPut AndPut NotPut

00000100

00000100 00000100 00000100

00000001 00000001 00000001

00000101 = $5 фиолетовый 00000101 = $5 фиолетовый 00000000 = $0 черный

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

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

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

FreeMem(P, Size);

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

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

uses Graph, Crt;

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

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

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);{ заполненный круг }

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

l\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, P1A);(P1A - содержимое (двоичный код) образа }

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

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

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

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

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

PutImage(x, y, Р1Л, 1); delay(50); PutImage(x, y, Р1Л, 1);

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

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

x:=x+10

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

FreeMem(P1, Size); FreeMem(P2, Size); CloseGraph

В приведенной программе в память заносятся два образа человечка с разным положением ног. Экран очищается и в цикле происходит поочередное извлечение образов со смещением по оси "х". Каждое изображение хранится на экране 0, 05 с. , затем исчезает, вследствие перерисовки в режиме XorPut.

Практическое задание N 1. 63

1.Создать перемещающуюся слева направо фигурку чередованием двух или трех образов с озвучиванием перемещения. Варианты фигурок:

-катящееся колесо со спицами,

-шагающий ослик,

-летящая со взмахами крыльев птица,

-летящий вертолет (вид сверху),

-гребец в лодке,

-прыгающий мяч, деформирующийся при ударе.

2.Создать картину: перемещение машины (прямоугольника) желтого цвета на фоне гор (треугольников) синего, темно-серого, фиолетового, зеленого цветов. Определить заранее цвет машины на фоне гор, и вывести названия этих цветов над горами.

3.Создать картину: перемещение самолета (треугольника) белого цвета на фоне облаков (эллипсов) голубого, ярко- голубого, ярко- синего, ярко- серого цветов. Определить заранее цвет самолета на фоне облаков, и вывести названия этих цветов над облаками.

4.Создать "бегущую строку" ( в графическом режиме ). Для этого необходимо вывести на экран надпись и в цикле выводить в другой области экрана часть буфера от 0 до Size и от Size до 0, одновременно изменяя координату "х" начала вывода строки от GetMaxX до нуля.

1. 15. 5. 2. Мультипликация с чередованием видеостраниц

Для изменения всего изображения на экране необходимо быстро заменять рисунок на экране другим, готовым рисунком. Это обеспечивается возможностью рисования " вслепую" -



[стр.Начало] [стр.1] [стр.2] [стр.3] [стр.4] [стр.5] [стр.6] [стр.7] [стр.8] [стр.9] [стр.10] [стр.11] [стр.12] [стр.13] [стр.14] [стр.15] [стр.16] [стр.17] [стр.18] [стр.19] [стр.20] [стр.21] [стр.22] [стр.23] [стр.24] [стр.25] [стр.26] [стр.27] [стр.28] [стр.29] [стр.30] [стр.31] [стр.32] [стр.33] [стр.34] [стр.35] [стр.36] [стр.37] [стр.38] [стр.39] [стр.40] [стр.41] [стр.42] [стр.43] [стр.44] [стр.45] [стр.46] [стр.47] [стр.48] [стр.49] [стр.50] [стр.51] [стр.52] [стр.53]