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 ~ адреса оперативної пам’яті, що виділяється системою (змінна типу вказівник для збереження адреси). Покажемо тепер, як за допомогою цих підпрограм можна побудувати об’єкт, що рухається, на прикладі задачі.
ЗАДАЧА № 638 (1)
Умова: «Баскетбол». Зобразити на екрані відбивання від підлоги, стін та стелі м’яча, що зображається зафарбованим кругом. Для спрощення алгоритму траєкторію руху м’яча вважати ламаною лінією. Силою тертя повітря знехтувати.
Розв’язування: У наведеній нижче програмі описані наступні константи: R— радіус м’яча; Time- час затримки зображення на екрані (підбирається емпіричним шляхом залежно від типу комп’ютера).
Крім того використовуються наступні змінні: хта увказують на координати області екрана, куди виводиться, а потім звідки витирається зображення; Sizeта BitMap— використовуються для збереження зображення в оперативній пам’яті (дивись вище); Step_xта Step_y -задають крок, на який пересувається об’єкт при кожному наступному перемальовуванні (теж підбирається емпірично в залежності від типу ПЕОМ).
Перший раз м’яч малюється в лівому верхньому кутку екрану і напрямок його руху - зверху вниз, зліва направо, тому початкові координати області зображення х та у дорівнюють 0, а обидва кроки додатні. Далі, якщо об’єкт долітає до границі екрана, то крок змінюється на протилежний за знаком, і об’єкт починає рухатись у зворотному напрямку. Програма, що реалізує запропонований алгоритм, має наступний вигляд:
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;
XnitGraph (gd,gm,’’);
SetColor(brown);
SetFillStyle(1,brown);
FillEllipse(R,R,R,R);
Size :- ImageSize(0,0,2*R,2*R);
GetMeM(BitMap,Size); GetImage(0,0,2*R,2*R,BitMap^);
repeat
delay(Time);
Putlmage(x,y,BitMap^,1);
x:=x+Step_x; y:=y+Step_y;
if (x+2*R >= getmaxx) or (x<=0) then Step_x:=-Step_x;
if (y+2*R >= getmaxy) or (y<=0) then Step_y:=-Step_y;
Putlmage(x,y,BitMap^,1);
until keypressed;
readkey;
CloseGraph;
end.
Третій метод, що дозволяє ще зменшити миготіння мультиплікаційного об’єкта на екрані, це використання графічних сторінок. Відомо, що при ініціалізації графічного режиму ми задаємо два параметри:
Gd- тип графічного адаптера (CGA, EGA, VGA і т.д.);
Gm - режим роботи графічного адаптера.
Залежно від цих параметрів на екран можна виводити зображення з різною роздільною здатністю та палітрою. Крім того, існують деякі режими, що підтримують кілька графічних сторінок, кожна з яких може містити різні зображення. В один момент часу ми можемо бачити тільки одну сторінку, але в той самий момент можемо готувати складне зображення на інших сторінках і потім миттєво виводити їх на екран, зменшуючи таким чином миготіння (людина не бачить малювання окремих деталей пейзажу). Один з таких режимів Gm=VGAMedдозволяє програмісту виводити 16-кольорове зображення з роздільною здатністю 640 на 350 пікселів, при цьому він підтримує дві графічних сторінки.
Читать дальше