TURBO PASCAL

Новости       

Программы

Turbo Pascal

Игры

Документация

"Странности"

FAQ

Ссылки

Благодарности 

Гостевая книга

Спонсор

От автора

 

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.   

 

На первую страницу

Rambler's Top100 PROext: Top 1000
Rambler's Top100

(с) Все права защищены.

По всем интересующим вопросам прошу писать электронный адрес

Hosted by uCoz