Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- {Движение закрашенного полукруга по кромке экрана с повторотом на 90 градусов в углах}
- uses
- GraphABC;
- const
- init_alpha1 = 0;
- init_alpha2 = 180;
- radius = 20;
- type
- {------------------------------------------}
- {---------------Класс Point----------------}
- {------------------------------------------}
- Point = class
- protected
- x:integer := 1;{координаты}
- y:integer := 1;
- cl:Color := clDarkBlue;{цвет}
- isVisible : boolean := false;{видимость}
- public
- constructor Create(cx,cy:integer);
- procedure Show;virtual;
- procedure Hide;virtual;
- procedure Move(cx,cy:integer);
- procedure ChangeColor(Clr:Color);
- {Т.к. здесь память управляется сборщиком мусора,}
- {деструктор не обязателен}
- end;
- {------------------------------------------}
- {----------------Класс SemiCircle-----------------}
- {------------------------------------------}
- SemiCircle = class(Point)
- protected
- radius: Integer;
- alpha1, alpha2: word;
- isFill: boolean := true;{закрашен или нет}
- public
- constructor Create(cx, cy, r: integer);
- procedure Show; override;
- procedure Hide; override;
- procedure Turn(new_alpha1, new_alpha2: word);
- procedure ChangeFullness(isF: boolean);
- {Т.к. здесь память управляется сборщиком мусора,}
- {деструктор не обязателен}
- end;
- {------------------------------------------}
- {-----------Методы класса Point------------}
- {------------------------------------------}
- constructor Point.Create(cx, cy: integer);
- begin
- if(x > 0) and (y > 0) then
- begin
- x := cx;
- y := cy;
- end;
- end;
- {------------------------------------------}
- procedure Point.Show();
- begin
- SetPixel(x, y, cl);
- isVisible := true;
- end;
- {------------------------------------------}
- procedure Point.Hide;
- begin
- SetPixel(x, y, clWhite);{цвет фона - белый}
- isVisible := false;
- end;
- {------------------------------------------}
- procedure Point.Move(cx, cy: integer);
- begin
- if isVisible then
- begin
- Hide;
- isVisible := true;
- end;
- if(x > 0) and (y > 0) then
- begin
- x := cx;
- y := cy;
- end;
- if isVisible then
- Show;
- end;
- {------------------------------------------}
- procedure Point.ChangeColor(Clr: Color);
- begin
- cl := Clr;
- Show;
- end;
- {------------------------------------------}
- {------------Методы класса SemiCircle-------------}
- {------------------------------------------}
- constructor SemiCircle.Create(cx, cy, r: integer);
- begin
- inherited Create(cx, cy); {Вызов конструктора Point.Create}
- if (r > 0) then
- begin
- radius := r;
- alpha1:=init_alpha1;
- alpha2:=init_alpha2;
- end;
- end;
- {------------------------------------------}
- procedure SemiCircle.Show();
- begin
- if isFill then
- begin
- SetBrushColor(cl);{цвет заполнененного полукруга}
- FillPie(x, y, radius, alpha1, alpha1);
- end
- else
- begin
- SetPenColor(cl);{цвет полого полукруга}
- DrawPie(x, y, radius, alpha1, alpha1);
- end;
- isVisible := true;
- end;
- {------------------------------------------}
- procedure SemiCircle.Hide();
- begin
- if isFill then
- begin
- SetBrushColor(clWhite);{цвет фона - белый}
- FillPie(x, y, radius, alpha1, alpha1);
- end
- else
- begin
- SetPenColor(clWhite);{цвет фона - белый}
- DrawPie(x, y, radius, alpha1, alpha1);
- end;
- isVisible := false;
- end;
- {------------------------------------------}
- procedure SemiCircle.Turn(new_alpha1, new_alpha2: word);
- begin
- alpha1:=new_alpha1;
- alpha2:=new_alpha2;
- end;
- {------------------------------------------}
- procedure SemiCircle.ChangeFullness(isF: boolean);
- begin
- isFill := isF;
- end;
- {------------------------------------------}
- {-------------Тело программы---------------}
- {------------------------------------------}
- var
- b: SemiCircle; {здесь класс - ссылочный тип, т.е. b на самом деле
- {является указателем на экземпляр класса.}
- x, y, i: integer;
- alpha1, alpha2: word;
- begin
- TextOut(1, 1, 'Движение закрашенного полукруга по кромке экрана с повторотом на 90 градусов в углах');
- b := SemiCircle.Create(WindowWidth-radius, radius, radius);{Вызов конструктора, выделение памяти}
- b.Show;
- y := 40; {располагаем полукруг под текстом}
- for i := 1 to 50 do {Демонстрация 50 раз}
- begin
- {пока не дойдём до правого края}
- while(x < WindowWidth + b.radius) do
- begin
- x := x + 1; {Вычисляем координаты}
- b.Move(x, y);{Перемещаем полукруг}
- sleep(10);{задержка, чтобы успеть всё это увидеть}
- end;
- alpha1:=alpha1+90;
- alpha2:=alpha2+90;
- b.Turn(alpha1, alpha2);
- while (y + b.radius < WindowHeight) do
- begin
- y:=y+1;
- b.Move(x, y);
- sleep(10);
- end;
- alpha1:=alpha1+90;
- alpha2:=alpha2+90;
- b.Turn(alpha1, alpha2);
- while(x + b.radius > 40) do
- begin
- x := x - 1;
- b.Move(x, y);
- sleep(10);
- end;
- alpha1:=alpha1+90;
- alpha2:=alpha2+90;
- b.Turn(alpha1, alpha2);
- while(y > 40) do
- begin
- y := y - 1;
- b.Move(x, y);
- sleep(8);
- end;
- alpha1:=init_alpha1;
- alpha2:=init_alpha2;
- b.Turn(alpha1, alpha2);
- end;
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement