АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

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

Читайте также:
  1. Aufgabe 4. Везде ли нужна частица “zu”?
  2. I. Размер базовой части трудовой пенсии по старости.
  3. I. Расчет накопительной части трудовой пенсии.
  4. I. Расчет размера страховой части трудовой пенсии.
  5. II частина. Проблема спеціальних здібностей у сучасній диференційній психології
  6. II. Прочтите слова и определите части речи( глаголы, существительные,
  7. Адгезия – притяжение частиц из разных фаз.
  8. Алекс, Стивенсон и часть группы заняли свои места на диванчиках по обе стороны от экрана, на котором сейчас было изображение эмблемы передачи.
  9. АЛЬЯНСЫ С ДОЛЕВЫМ УЧАСТИЕМ
  10. Анализ и прогнозирование товарооборота организаций общественного питания как части розничного товарооборота
  11. Античастицы. Аннигиляция.
  12. Большей части прямо —он провозглашен почти всеми конститу-

 

 

Прежде чем сохранить фрагмент экрана, под него нужно отвести память, размер (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; { достижение края }

 


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 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 |

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



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.01 сек.)