TURBO PASCAL |
Новости |
1. 15. 5. 1. Мультипликация с запоминанием части экрана
Прежде чем сохранить фрагмент экрана,
под него нужно отвести память,
размер (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 и
т. д.
Освобождение (очистка)
участков памяти
размером "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;
{ достижение края
}
FreeMem(P1, Size); FreeMem(P2,
Size); CloseGraph End.
В приведенной программе в память
заносятся два образа человечка с разным
положением ног. Экран
очищается и в цикле происходит поочередное
извлечение образов со смещением по оси "х".
Каждое изображение хранится на экране 0,
05 с. , затем
исчезает, вследствие
перерисовки в режиме XorPut.
|
(с) Все права защищены. По всем интересующим вопросам прошу писать электронный адрес |