until keypressed;
readkey; CloseGraph;
end.
Запропонований метод побудови мультиплікаційних об’єктів являється найпростішим, але якщо об’єкт, що рухається, має більші лінійні розміри, ніж в запропонований задачі, він буде суттєво миготіти на екрані. Тому існує інший підхід до розв’язку цієї задачі. Пропонується алгоритм:
а) намалювати бажаний об’єкт;
б) запам’ятати область екрана, з виведеним малюнком;
в) відновити екран в місці, де був малюнок (тобто стерти малюнок);
г) вивести малюнок на нове місце і т.д.
Цей підхід дуже схожий на попередній варіант, але має суттєві переваги в тому, що не потребує багаторазового перемалювання малюнку. Об’єкт створюється один раз, зберігається його копія, а потім виводиться в потрібному місці. Для зберігання намальованого фрагмента необхідно використовувати оперативну пам’ять, причому так як ми не знаємо розміри об’єкта на початку програми, пам’ять необхідно запрошувати у системи безпосередньо під час роботи програми. Це можна зробити тільки використовуючи динамічну пам’ять за допомогою наступних процедур:
1) GetImage(x1,y1,x2,y2,BitMap) - зберігає образ вказаної прямокутної області екрана в динамічній області пам’яті. В цій процедурі х1, у1, х2, у2 — координати лівого верхнього та правого нижнього кутівпрямокутної області екрана, образ якої ми хочемо зберегти; ВitМар - адреса області пам’яті, в якій ми зберігаємо об’єкт.
2) Putlmage (x,y,BitMap,Mode) - відновлює збережений образ прямокутної області. Тут x, у - координати верхнього лівого кута області екрана,в яку ми хочемо помістити зображення; BitMap - адреса пам’яті, в якій було збережено зображення; Mode - режим накладання зображення на екран. Режимів накладання існує 5 (від 0 до 4), але самими цікавими для нас являються СоруРut(0) -заміщення новим об’єктом старого зображення та XOR (1) - «витирання» старого об’єкта. Крім цих основних процедур при використанні оперативної пам’яті для збереження об’єкта нам знадобляться ще дві. Перша допомагає визначити об’єм необхідної пам’яті в байтах для збереження прямокутного малюнку, а друга запрошує у системи відповідну область пам’яті. їх використовують разом наступним чином:
{визначається необхідний розмір області пам’яті}
Size : ImageSize(xl,yl,x2,y2);
{у системи запрошується оперативна пам’ять}
GetMem(BitMap,Size);
де x1,y1,x2,y2 - координати прямокутної області екрану, де знаходиться малюнок;
Крім того використовуються наступні змінні: х та у вказують на координати області екрана, куди виводиться, а потім звідки витирається зображення; Size та BitMap — використовуються для збереження зображення в оперативній пам’яті (дивись вище); Step_xта Step_y-задають крок, на який пересувається об’єкт при кожному наступному перемальовуванні (теж підбирається емпірично в залежності від типу ПЕОМ).
Перший раз м’яч малюється в лівому верхньому кутку екрану і напрямок його руху - зверху вниз, зліва направо, тому початкові координати області зображення
Program Example_638_l;
uses crt,graph;
const R=20;
Time = 1000;
var gd,gm:integer;
x,у:integer; Size:integer;
Step_x,Step_y:integer;
BitMap:pointer;
begin
x:=0; y:=0; Step_x:=5; Step_y:=5;
gd:=VGA; gm:=VGAHi;