![]() |
![]() |
Shpion |
![]()
Сообщение
#1
|
Группа: Пользователи Сообщений: 5 Пол: Мужской Реальное имя: Александр Репутация: ![]() ![]() ![]() |
Вот, попросили сделать задачу на Паскале..
Я взялся, даже не посмотрев... Оказалось, там требуется знание графических приемов программирования в Паскале... А я тогда вообще ничего не шарил... Ладно, большинство задач сделал, осталась одна - последняя: Нарисовать на Паскале град, падающий и отскакивающий от объекта. Так как я за такие вещи раньше никогда не брался, то с непревычки оказалось трудно... Дальше последует код, а пока 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. Вообщем, помогите, кто чем может - исходниками, советами.... Выручайте... ![]() ЗЫ: Может, удобней будет посмотреть мою ошибку - выложил этот исходник... Сообщение отредактировано: Shpion - 22.05.2006 1:15 Прикрепленные файлы ![]() |
![]() ![]() |
Shpion |
![]() ![]()
Сообщение
#2
|
Группа: Пользователи Сообщений: 5 Пол: Мужской Реальное имя: Александр Репутация: ![]() ![]() ![]() |
Опять возникли проблемы:
Код 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)Как "уловить" наклонную поверхность? Я пытался создавать массив точек.. ну, короче, делал чепуху.. ![]() 2.2)С GetPixel не получается... Цвета не сравнивает 2.3)Если установить на градину таймер, то она будет просто исчезать? 2.4) Отскакивает резко вверх, вообщем некрасиво... Выкладываю исходник: 2.2) Прикрепленные файлы ![]() |
![]() ![]() |
![]() |
Текстовая версия | 27.07.2025 6:04 |