|
||||||||||||||||||||||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Мультипликация с запоминанием части экрана
Прежде чем сохранить фрагмент экрана, под него нужно отвести память, размер (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) - " НЕ" (замена изображения на экране инверсным изображением из буфера). Цвет пикселов изображения из буфера не изменяется, если рисунок выводится в область, залитую фоном. Цвет пикселов изображения из буфера изменяется в соответствии с логическими операциям над битами, определяющими цвет пикселов, если рисунок выводится в область заполненных каким либо цветом фигур. Например, при выводе красного круга на синий прямоугольник результирующий цвет пикселов будет: Режим вывода Значения битов, соответствующие цвету пиксела красный цвет синий цвет результирующий цвет XorPut 00000100 00000001 00000101 = $5 фиолетовый OrPut 00000100 00000001 00000101 = $5 фиолетовый AndPut 00000100 00000001 00000000 = $0 черный NotPut 00000100 $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; { достижение края }
Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.006 сек.) |