Пример реализации лыжника, который спускается с горы
uses Crt, graph;
var i,driver,mode:integer;
{Создаем тип для удобства работы с координатами}
TypeTPoint=Record
x:Integer;
y:Integer;
end;
{Создаем тип для работы с линиями}
TLine=Recordx1,y1,x2,y2:Integer;
end;
TLiznik1=Record {Определяем Тип - Тело Лыжника }
Golova:TPoint; {Окружность - Голова лыжника}
R:Integer; {Радиус головы}
Tulo:TLine; {Линия, обозначающая тело лыжника}
Ruka1,Ruka2:TLine; {Линии, обозначающие руки лыжника}
Noga1,Noga2:TLine; {Линии, обозначающие ноги лыжника}
Liza1,Liza2:TPoint; {Лыжи}
end;
Var Sklon1:TLine; {Пряма обозначающая одну границу дороги}
Sklon2:TLine; {Прямая, обозначающая вторую границу дороги}
Golova:TPoint; {Голова Лыжника}
Liznik:TLiznik1; {Весь лыжник}
{Рисуем Лыжи}
procedure GetLizi;
Var
l1:Integer;
l2:Integer;
Begin
l1:=50; {Длина лыж}
l2:=20; {Наклон лыж}
{Прорисовка лыж (x1,y1,x2,y2)}
Line(Liznik.Noga1.x2-l1+5,Liznik.Noga1.y2-l2+3,Liznik.Noga1.x2+l1+15,Liznik.Noga1.y2+l2);
Line(Liznik.Noga2.x2-l1+5,Liznik.Noga2.y2-l2+3,Liznik.Noga2.x2+l1+15,Liznik.Noga2.y2+l2);
end;
{Перерисовка изображения и сдвиг лыжника по координатам
В процедуру добавляются параметры. Это позиция головы лыжника
Сдвигая 2 точки головы лыжника, мы сдвинем всё его тело
вместе с лыжами}
procedure Liznik_edet(sdvigX,sdvigY:Integer);Begin
Golova.X:=SdvigX;{Сдвиг по оси X}
Golova.Y:=SdvigY;{Сдвиг по оси Y}
end;
{Первая прорисовка лыжника}
procedure Liznik_One;
Var ii:Integer; {Количество перерисовок}
Begin
{Рисуем голову лыжнику}
Circle(Liznik.Golova.x,Liznik.Golova.y-Liznik.R,Liznik.R);
{Рисуем туловище }
With Liznik.Tulo do Begin
x1:=Liznik.Golova.X;
y1:=Liznik.Golova.y;
x2:=Liznik.Golova.x-30;
y2:=Liznik.Golova.y+30;
Line(x1-10,y1,x2,y2);
end;
{Рисуем первую руку}
With Liznik.Ruka1 do Begin
x1:=Liznik.Tulo.x1-10;
y1:=Liznik.Tulo.y1;
x2:=Liznik.Tulo.X1-45;
y2:=Liznik.Tulo.Y1;
Line(x1,y1,x2,y2);
end;
{Рисуем вторую руку}
With Liznik.Ruka2 do Begin
x1:=Liznik.Ruka1.x1;
y1:=Liznik.Ruka1.y1;
x2:=Liznik.Ruka1.x2+5;
y2:=Liznik.Ruka1.y2-30;
Line(x1,y1,x2,y2);
end;
{Рисуем первую ногу}
With Liznik.Noga1 do Begin
x1:=Liznik.Tulo.x2;
y1:=Liznik.Tulo.y2;
x2:=x1-30;
y2:=y1+20;
Line(x1,y1,x2,y2);
end;
{Рисуем вторую ногу}
With Liznik.Noga2 do Begin
x1:=Liznik.Noga1.x1;
y1:=Liznik.Noga1.y1;
x2:=x1+5;
y2:=Liznik.Noga1.y2+20;
Line(x1,y1,x2,y2);
end;
{Рисуем лыжи. Будем рисовать лыжи из окончания каждой ноги}
GetLizi;
end;
{Рисуем 2 склона, символизирующие дорогу }
procedure Gora;
const
Nakl1=50;
Nakl2=100;
Begin
Sklon1.x1:=20; Sklon2.x1:=Sklon1.x1+Nakl1;
Sklon1.y1:=300; Sklon2.y1:=Sklon1.y1-Nakl2;
Sklon1.x2:=700; Sklon2.x2:=Sklon1.x2+Nakl1;
Sklon1.y2:=500; Sklon2.y2:=Sklon1.y2-Nakl2;
Line(Sklon1.x1,Sklon1.y1,Sklon1.x2,Sklon1.y2);
Line(Sklon2.x1,Sklon2.y1,Sklon2.x2,Sklon2.y2);
end;
var ii:Integer; {Число перерисовок}
begin
driver:=detect;
initgraph(driver,mode,'');
if graphresult<>0 then
begin
writeln('ne wislo');
halt
end;
gora; {Ставим лыжника на гору}
i:=0;
{Здесь определяем первоначальную позицию лыжника и размер его головы}
Liznik.Golova.x:=Sklon2.x1+Liznik.Golova.x*5;
Liznik.Golova.y:=Sklon2.y1;
Liznik.R:=15;
{50 повторений с шагом 1}
for ii:=0 to 50 do Begin
Liznik_One; {Рисуем лыжника}
Liznik.Golova.y:=Liznik.Golova.y+3; {Смещаем лыжника по Оси X}
Liznik.Golova.x:=Liznik.Golova.x+10;{Смещаем лыжника по Оси Y}
delay(50); {Скорость перемещения}
ClearDevice; {Очищаем прошлый рисунок}
Gora; {Перерисовываем гору}
end;
readln;
end.
Комментариев нет:
Отправить комментарий