Показать сообщение отдельно
Старый 27.12.2009, 21:00   #2 (permalink)
AlexZir
support
 
Аватар для AlexZir
 
Регистрация: 19.08.2007
Адрес: Зея
Сообщений: 15,797
Записей в дневнике: 71
Сказал(а) спасибо: 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.
__________________
Убить всех человеков!
AlexZir вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070