КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Реализация имитации движения графических объектов
Алгоритм построения окон и статических объектов в них Задача 1. Построить два окна на одном экране. В первом окне вывести разноцветные концентрические окружности, радиус которых пропорционально возрастает, и вложенные одноцветные прямоугольники, размеры которых пропорционально возрастают. Во втором окне вывести текст "Кто владеет информацией, тот владеет миром". Program window2; Uses Graph; Var I, Driver, Mode:integer; Procedure GrInit; Begin Driver:=Detect; { автораспознавание драйвера } InitGraph (Driver, Mode, ‘’); If GraphResult<>0 then begin Writeln ('Ошибка инициализации!'); Writeln ('Работа программы прервана'); Halt (1) { остановить выполнение программы с кодом завершения – 1 } End End; Begin GrInit; { графические действия } ClearDevice; {построение первого окна и рисунков в нем:} SetColor(1); SetViewPort(0,0,GetMaxX-1,GetMaxY-1,true); Rectangle(0,0,GetMaxX-1,GetMaxY-1); SetFillstyle(1,11); Bar(0,0,GetMaxX-1,GetMaxY-1); for i:=0 to 120 do begin setcolor(Random(15)); circle(2*i,2*i,i); end; SetColor(0); for i:=50 downto 1 do rectangle(320+i*3,40+i,320+i*4,50+i*6); {построение второго окна и вывод текста в нем:} setviewport(0,401,GetMaxX-1,GetMaxY-1,true); SetFillstyle(1,14); Bar(0,0,GetMaxX-1,GetMaxY-1); SetColor(6); Rectangle(0,1,GetMaxX-1,GetMaxY-1); Setcolor(0); SetTextStyle(0,0,1); OutTextXY(150,35,’КТО ВЛАДЕЕТ ИНФОРМАЦИЕЙ, ТОТ ВЛАДЕЕТ МИРОМ.’); Readln; CloseGraph End. Создать видимость движения на экране можно двумя способами. Первый способ заключается в том, что имитация движения объекта на экране создается за счет многократного выполнения программой набора действий: нарисовать – пауза – стереть рисунок (нарисовать его в том же месте цветом фона) – изменить координаты изображения. Перед началом составления программы надо продумать описание "двигающегося" объекта; характер изменения координат, определяющих текущее положение объекта; диапазон изменения и шаг. Задача 1. Организовать имитацию движения по экрану компьютера автомобиля. Program automoto; Uses Graph; Var u,gm,gd:integer; BEGIN gd:=detect; initgraph(gd,gm,’’); if graphresult<>0 then halt(1); setviewport(1,1,600,450,true); setbkcolor(lightgray); setcolor(brown); line(1,401,700,401);{нарисовали дорогу} u:=1; while u<= 600 do begin setcolor(darkgray); rectangle(40+u,315,90+u,350); {кабина машины} setfillstyle(1,darkgray); bar(5+u,350,120+u,390); {кузов машины} setfillstyle(1,yellow); setcolor(yellow); line(121+u,360,160+u,400); line(160+u,400,200+u,400); {свет от фар машины } line(200+u,400,121+u,360); floodfill(180+u,399,yellow); pieslice(40+u,385,0,360,15); pieslice(90+u,385,0,360,15); {нарисуем колеса} delay(30); setfillstyle(1,lightgray); bar(5+u,300,210+u,400); {очистка места расположения машины} u:=u+3 end; readln; closegraph END. Второй способ имитации движения рисунка или его части состоит в его запоминании в отдельной области оперативной памяти, с тем, чтобы в дальнейшем быстро восстановить это изображение в другом месте экрана. Для хранения фрагмента удобнее всего использовать динамическую область памяти. Получить размер памяти в байтах, необходимой для сохранения образа фрагмента, позволяет функция ImageSize(X1,Y1,X2,Y2: integer): word. Здесь X1,Y1 и X2,Y2 – координаты верхнего левого и нижнего правого углов прямоугольника. Если полученный размер памяти больше 64Кб, то значение ImageSize =0, a GraphResult = -11. Чтобы этого избежать, следует сохранять изображение по частям. Полученный с помощью функции ImageSize размер памяти применяют в качестве входной информации для процедуры GetMem(p,Size), которая выделяет указанный объем памяти в динамической области: Здесь р – указатель на область памяти, Size – ее размер. Процедура GetImage(X1,Y1,X2,y2:integer; var BitMap:word); сохраняет образ фрагмента в памяти, где X1,Y1,X2,Y2 – координаты фрагмента, BitMap – переменная, которая указывает, где сохраняется образ изображения. Процедура PutImage(X,Y:integer; var BitMap, Mode:word); восстанавливает сохраненный в буфере BitMap прямоугольник, левый верхний угол которого задается координатами X,Y. Параметр Mode задает режим вывода изображения. Задача 1. Построить на экране компьютера башню, имитируя процесс ее построения снизу вверх. Uses Graph; Var P:pointer; {указатель на область} Size:Word; {размер области} X1,Y1:Word; {координаты начальной точки} gd,gm:integer; Begin gd:=detect; InitGraph(gd,gm,’’); IF GraphResult<>0 THEN Halt(1); SetViewPort(0,0,640,80,TRUE); ClearViewPort; SetBkColor(black); SetColor(yellow); SetLineStyle(0,1,Thickwidth); Rectangle(120,400,200,440); {рисуем первый кирпич башни} Size:=ImageSize(120,400,200,400); {определяем размер области} GetMem(p,Size); {выделяем память для области} GetImage(120,400,200,440,P^); {сохраняем область в памяти} Y1:=400; WHILE Y1>=40 DO begin X1:=120; WHILE X1<=440 DO Begin PutImage(X1,Y1,p^,CopyPut); {строим башню} Delay(200); X1:=X1+80; end; Y1:=Y1-40 end; WHILE X1<=440 DO {строим верх башни} Begin PutImage(X1,Y1,p^,CopyPut); {CopyPut=0 – режим копирования изображений} X1:=X1+160; end; SetColor(black); Line(200,120,280,120); {строим окна в башне} Line(360,120,440,120); Readln; CloseGraph End. Контрольные вопросы:
Дата добавления: 2014-01-04; Просмотров: 617; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |