IPB
ЛогинПароль:

> Создать град(отскакивающий от объекта), Графика в Паскале
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 5
Пол: Мужской
Реальное имя: Александр

Репутация: -  0  +


Вот, попросили сделать задачу на Паскале..
Я взялся, даже не посмотрев... Оказалось, там требуется знание графических приемов программирования в Паскале... А я тогда вообще ничего не шарил... Ладно, большинство задач сделал, осталась одна - последняя:

Нарисовать на Паскале град, падающий и отскакивающий от объекта.

Так как я за такие вещи раньше никогда не брался, то с непревычки оказалось трудно... Дальше последует код, а пока 2 вопроса:
1)Как сделать так, чтобы при достижении градинок определенной границы, эти градинки продолжали движение, и создавались новые(т.е как бы создавался непрерывный поток)
2) Как "уловить" кривую" линию объекта(крыши дома, например)

Вот код(c пояснениями) моей так называемой программы. Это далеко не законченный вариант, ибо у меня уже опускаются руки(может, ночь просто?):

Код

program rain;
uses graph,crt;

type grad = object    
{создается тип "град"}                                                                                  
x,y:integer;
radius:word;
dx,dy:shortint;

constructor     initgrad(x0,y0:integer; radius0: word; dx0,dy0: shortint);
{Конструктор - создатель града  }        
procedure show;
procedure hide;
procedure move;
procedure checkborder;
end;

var gd,gm,i,x,Radius,dx,y,dy:integer;
grads:array[1..50] of grad;                                                                          
{Массив градин}

procedure creategrad(k,x,y:integer);                                  
{  k - если=0, то создается "кучка" градин, если  k<>0(=i), то создается одна градина с
текущими кординатами   }
        
begin
if k=0 then
for i:=1 to 10 do
begin
Radius:=3;
dy:=1;
y:=random(100);
grads[i].initgrad(random(Getmaxx),y,radius,0,dy);
end else
grads[k].initgrad(random(getmaxx),y,radius,0,dy);
end;


procedure grad.move;
begin
x:=x+dx;
y:=y+dy;
end;

procedure grad.show;
begin
SetFillStyle(1,8);
FillEllipse(x,y,radius,radius);
end;

procedure grad.hide;
begin
setcolor(black);
FillEllipse(x,y,radius,radius);
end;

procedure grad.checkborder;        
{Это я на CheckBorder'е и запарился!!!!!!}                            
begin
if y=250 then  creategrad(i,x,random(10));
end;


constructor grad.initgrad(x0,y0:integer; radius0: word; dx0,dy0: shortint);
begin
x:=x0;
y:=y0;
Radius:=Radius0;
dx:=dx0;
dy:=dy0;
end;

begin
    initgraph(gd,gm,'');
    if graphresult<> grOk then begin
    writeln('No graphics');
    readln;
    halt;
    end;
    creategrad(0,x,y);

repeat
cleardevice;

for i:=1 to 10 do
begin
randomize;
grads[i].show;
end;

delay(500);

for i:=1 to 10 do
grads[i].hide;

for i:=1 to 10 do
begin
grads[i].move;
grads[i].checkborder;
end;

until keypressed;

readln;
closegraph;
end.





Вообщем, помогите, кто чем может - исходниками, советами.... Выручайте... unsure.gif
ЗЫ: Может, удобней будет посмотреть мою ошибку - выложил этот исходник...

Сообщение отредактировано: Shpion -


Прикрепленные файлы
Прикрепленный файл  LAB5_GRA.zip ( 701 байт ) Кол-во скачиваний: 262
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2





Группа: Пользователи
Сообщений: 5
Пол: Мужской
Реальное имя: Александр

Репутация: -  0  +


Опять возникли проблемы:
Код

program rain;
uses graph,crt;

type grad = object
x,y:integer;
radius:word;
dx,dy,ddx,ddy:real;

constructor     initgrad(x0,y0:integer; radius0: word; dx0,dy0,ddx0,ddy0: real);
procedure show;
procedure hide;
procedure move;
procedure checkborder;
end;

const maxgrads=30;


var gd,gm,i,x,y,Radius:integer;
dx,dy,ddx0,ddy0:real;
grads:array[1..50] of grad;

procedure dom;
begin
Setcolor($eeee);
Rectangle(getmaxx-400,getmaxy,getmaxx-200,getmaxy-100);
line(getmaxX-400,getmaxy-100,getmaxx-300,getmaxy-200);
line(getmaxx-300,getmaxy-200,getmaxx-200,getmaxy-100);
end;

procedure creategrad(k,x,y:integer);
begin

dx:=random(6)/3;
if k=0 then
for i:=1 to maxGrads  do
begin
Radius:=3;
dy:=1;
dx:=random(2);
y:=random(GetMaxY);
grads[i].initgrad(random(getmaxx),random(getmaxy),radius,dx,dy,0,0);
end else
grads[k].initgrad(x,y,radius,dx,1,0,0);
end;


procedure grad.move;
begin
dx:=dx+ddx;
dy:=dy+ddy;
x:=round(x+dx);
y:=round(y+dy);

end;

procedure grad.show;
begin
setfillstyle(1,9);
FillEllipse(x,y,radius,radius);
end;

procedure grad.hide;
begin
setcolor(black);
FillEllipse(x,y,radius,radius);
end;

procedure grad.checkborder;
begin
if y=GetMaxY then  creategrad(i,Random(GetMaxX),0)
else
if (getpixel(x,y)=$eeee) then begin
dy:=-dy*0.6;
dx:=dx*0.6;
end;
end;


constructor grad.initgrad(x0,y0:integer; radius0: word; dx0,dy0,ddx0,ddy0: real);
...

begin

...

creategrad(0,x,y);

repeat

cleardevice;

dom;
setcolor(black);

for i:=1 to maxgrads do
begin
grads[i].show;
end;

delay(60);

for i:=1 to maxgrads do
begin
grads[i].hide;
end;

for i:=1 to maxgrads do
begin
grads[i].checkborder;
grads[i].move;
end;

until keypressed;

closegraph;
end.


1)При повышении скорости dy больше 1, градины начинают постепенно пропадать
2)Так и не смог разобраться с:
2.1)Как "уловить" наклонную поверхность? Я пытался создавать массив точек.. ну, короче, делал чепуху.. mega_chok.gif
2.2)С GetPixel не получается... Цвета не сравнивает
2.3)Если установить на градину таймер, то она будет просто исчезать?
2.4) Отскакивает резко вверх, вообщем некрасиво...

Выкладываю исходник:
2.2)


Прикрепленные файлы
Прикрепленный файл  LAB5_GRA.zip ( 891 байт ) Кол-во скачиваний: 244
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 28.04.2024 19:36
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name