|
Главная | Правила | Регистрация | Дневники | Справка | Пользователи | Календарь | Поиск | Сообщения за день | Все разделы прочитаны |
|
Опции темы | Опции просмотра |
27.12.2009, 20:02 | #1 (permalink) |
Экономичный вид памяти
Регистрация: 19.02.2008
Сообщений: 2,632
Записей в дневнике: 1
Сказал(а) спасибо: 6
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 2794
|
Pascal графика тип движения
Через что его можно выразить? Вот собственно моя работа только здесь скопипастенное движение по диагонали. Код:
Uses Crt,Graph; Const FigureHight=55; FigureWidth=35; FigureColor=red; FigureBackground=blue; MenuText:array[1..3]of string = ('Svobodni','Upravlenie','Exit'); var select,i,gd,gm:integer; konez:boolean; ch:char; procedure Gagarin(x,y,color,background:integer); begin setcolor(color); line(x, y, x+40, y+25); line(x, y, x+20, y+25); line(x+20, y+25, x+100, y+25); line(x+20, y+55, x+100, y+55); line(x+20, y+25, x+20, y+55); line(x+100, y+55, x+130, y+40); line(x+100, y+25, x+130, y+40); line(x+20, y+55, x, y+80); line(x, y+80, x+40, y+55); circle(x+90, y+40, 10); circle(x+70, y+40, 10); circle(x+50, y+40, 10); end; procedure Upravlenie; var x,y,ckorost:integer; begin x:=getmaxx div 2; y:=getmaxy div 2; ckorost:=1; repeat Gagarin(x,y,FigureColor,FigureBackground); ch:=readkey; Gagarin(x,y,black,black); case ch of #72:if (y-ckorost)>10 then dec(y,ckorost); #80:if (y+ckorost+FigureWidth)<480 then inc(y,ckorost); #75:if (x-ckorost)>10 then dec(x,ckorost); #77:if (x+ckorost+FigureHight)<640 then inc(x,ckorost); '+':if ckorost<60 then inc(ckorost); '-':if ckorost>0 then dec(ckorost); end; until (ch=#27)or(ch=#13); end; procedure Svobodnoe; const maxx=640-FigureWidth; minx=5; maxy=480-FigureHight; miny=5; var x1,y1:integer; x,y,vx,vy:real; begin x:=minx; y:=miny; x1:=minx; y1:=miny; repeat Gagarin(trunc(x),trunc(y),black,black); if(trunc(x)<=minx)and(trunc(y)<=miny)then begin x1:=maxx; y1:=miny; vx:=trunc((x1-x)/100); vy:=trunc((y1-y)/100); end; if(trunc(x)>=maxx)and(trunc(y)<=miny)then begin x1:=minx; y1:=maxy; vx:=trunc((x1-x)/100); vy:=trunc((y1-y)/100); end; if(trunc(x)<=minx)and(trunc(y)>=maxy)then begin x1:=maxx; y1:=maxy; vx:=trunc((x1-x)/100); vy:=trunc((y1-y)/100); end; if(trunc(x)>=maxx)and(trunc(y)>=maxy)then begin x1:=minx; y1:=miny; vx:=trunc((x1-x)/100); vy:=trunc((y1-y)/100); end; x:=x+vx; y:=y+vy; Gagarin(trunc(x),trunc(y),FigureColor, FigureBackground); delay(2000); until keypressed; readkey; end; Begin gd:=detect; initgraph(gd,gm,''); randomize; konez:=false; repeat cleardevice; select:=1; repeat for i:=1 to 3 do begin if i=select then setcolor(Red) else setcolor(green); outtextxy((getmaxx div 2)-50,(getmaxy div 2)-50+i*16,MenuText[i]); end; ch:=readkey; case ch of #72:dec(select); #80:inc(select); end; if select<1 then select:=3; if select>3 then select:=1; if ch=#27 then begin select:=3; ch:=#13; end; until (ch=#13); cleardevice; case select of 1:Svobodnoe; 2:Upravlenie; 3:konez:=true; end; until konez; closegraph; End. Последний раз редактировалось Dram; 27.12.2009 в 20:48 |
27.12.2009, 20:02 | |
Helpmaster
Member
Регистрация: 08.03.2016
Сообщений: 0
|
Ранее на нашем форуме участники создавали аналогичные топики Графика C++ Схема датчика движения Графика |
27.12.2009, 21:00 | #2 (permalink) | |
support
Регистрация: 19.08.2007
Адрес: Зея
Сообщений: 15,797
Записей в дневнике: 71
Сказал(а) спасибо: 166
Поблагодарили 203 раз(а) в 86 сообщениях
Репутация: 75760
|
Движение можно реализовать несколькими способами. Но основной принцип: затирание на старом месте и рисование на новом - неизменно лежит в основе движения. Pascal предоставляет следующие возможности:
а) рисование с помощью примитивов - медленно и неэффективно, но доступно любому начинающему; б) метод PutImage и работа с памятью и графическими матрицами - быстрее но требует четкого определения размера объекта; в) формирование изображения на странице видеопамяти и переключение между страницами - используется в игровых приложениях и сейчас. Так, к примеру, можно задать цикл движения до тех пор, пока не будет нажата клавиша. В цикле в переменную считывать случайное значение направления движения, которое будет служить условием для вложенного цикла перемещения объекта на случайные dx и dy. По достижении границ экрана внутренний цикл прерывается и управление передается внешнему циклу, в котором опять генерируется значение для направления. Пример использования метода PutImage. Реализовано движение только по горизонтали. Цитата:
__________________
Убить всех человеков! |
|
28.12.2009, 04:10 | #3 (permalink) | |
Экономичный вид памяти
Регистрация: 19.02.2008
Сообщений: 2,632
Записей в дневнике: 1
Сказал(а) спасибо: 6
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 2794
|
У меня вот как получилось
Цитата:
Последний раз редактировалось Dram; 28.12.2009 в 04:48 |
|
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
Опции темы | |
Опции просмотра | |
|
|