Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Помощь студентам


Ответ
 
Опции темы Опции просмотра
Старый 27.12.2009, 20:02   #1 (permalink)
Dram
Экономичный вид памяти
 
Аватар для Dram
 
Регистрация: 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
Dram вне форума   Ответить с цитированием

Старый 27.12.2009, 20:02
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Ранее на нашем форуме участники создавали аналогичные топики

Графика C++
Схема датчика движения
Графика

Старый 27.12.2009, 21:00   #2 (permalink)
AlexZir
support
 
Аватар для AlexZir
 
Регистрация: 19.08.2007
Адрес: Зея
Сообщений: 14,949
Записей в дневнике: 57
Сказал(а) спасибо: 135
Поблагодарили 164 раз(а) в 69 сообщениях
Репутация: 67284
По умолчанию

Движение можно реализовать несколькими способами. Но основной принцип: затирание на старом месте и рисование на новом - неизменно лежит в основе движения. 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 вне форума   Ответить с цитированием
Старый 28.12.2009, 04:10   #3 (permalink)
Dram
Экономичный вид памяти
 
Аватар для Dram
 
Регистрация: 19.02.2008
Сообщений: 2,632
Записей в дневнике: 1
Сказал(а) спасибо: 6
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 2794
По умолчанию

У меня вот как получилось
Цитата:
Program RGZ;
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;
Var X, Y, DX, DY : Integer;
Ch : Char;
Begin
X := Random (605);
Y := Random (480);
DX := 1;
DY := 1;
While TRUE do
Begin
ClearDevice;
Gagarin(X,Y,FigureColor,FigureBackground);
if Y >= 480 then DY := -DY;
if Y <= 0 then DY := -DY;
if X >= 640 then DX := -DX;
if X <= 0 then DX := -DX;
X := X + DX;
Y := Y + DY;
Delay (1000);
if KeyPressed then Begin
Ch := ReadKey;
if Ch = #27 then Break
End
End
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; 28.12.2009 в 04:48
Dram вне форума   Ответить с цитированием
Ads

Яндекс

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

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 07:40.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.