support
Регистрация: 19.08.2007
Адрес: Зея
Сообщений: 15,797
Сказал(а) спасибо: 166
Поблагодарили 203 раз(а) в 86 сообщениях
Репутация: 75760
|
Движение можно реализовать несколькими способами. Но основной принцип: затирание на старом месте и рисование на новом - неизменно лежит в основе движения. Pascal предоставляет следующие возможности:
а) рисование с помощью примитивов - медленно и неэффективно, но доступно любому начинающему;
б) метод PutImage и работа с памятью и графическими матрицами - быстрее но требует четкого определения размера объекта;
в) формирование изображения на странице видеопамяти и переключение между страницами - используется в игровых приложениях и сейчас.
Так, к примеру, можно задать цикл движения до тех пор, пока не будет нажата клавиша. В цикле в переменную считывать случайное значение направления движения, которое будет служить условием для вложенного цикла перемещения объекта на случайные dx и dy. По достижении границ экрана внутренний цикл прерывается и управление передается внешнему циклу, в котором опять генерируется значение для направления.
Пример использования метода PutImage. Реализовано движение только по горизонтали.
Цитата:
uses crt, graph;{подключение внешних модулей}
var y,x,gdriver,fonttype,gmode: integer;{определение типов переменных}
R: Pointer;{переменная для работы с памятью}
P: Pointer;
Size: Word;{положительные целочисленные переменные}
begin
gdriver:=detect;
initgraph(gdriver,gmode,'');
setfillstyle(1,9);
bar(0,0,640,480);
{----------------------------Рисуем левого таракана--------------------------------}
setfillstyle(1,11);
setcolor(0); sector(30,15,0,360,10,5); {тело}
line(35,12,35,18); line(35,15,20,15);
setcolor(8); line(40,14,47,11); Line(40,16,47,19); {усы}
{----------------------------Рисуем правого таракана--------------------------------}
setfillstyle(1,13);
setcolor(0); sector(580,15,0,360,10,5); {тело}
line(575,12,575,18); line(575,15,590,15);
setcolor(8); line(570,14,563,11); Line(570,16,563,19); {усы}
Size := ImageSize(15, 5, 65, 35); {переменная для резервирования памяти под рисунок с заданным размером}
GetMem(P,Size); {резервируем память под правого таракана}
GetMem(R,Size); {резервируем память под левого таракана}
GetImage(562,9,592,25,P^); {копируем правого таракана в память}
GetImage (19, 9,50, 25,R^);{копируем левого таракана в память}
setfillstyle(1,9); bar(0,0,640,480);{очищаем экран}
for x:=0 to 598 do {Цикл движения}
for y:=0 to 15 do {Цикл формирования вертикального ряда}
begin
PutImage (x-1,y*31+14, R^,3); {стираем старое}
PutImage (597-x,y*31, P^,3); {стираем старое}
PutImage (596-x,y*31, P^,0); {рисуем новое}
PutImage (x,y*31+14, R^,0); {рисуем новое}
if x>313 then {желтое растягиваем}
begin setcolor(14); line(x-2,y*31,x-2,y*31+30);
line(627-x,y*31-12,627-x,y*31+30); end;
end; {for y}
readln;
end.
|
__________________
Убить всех человеков!
|