Advertisement
Domerk

----

Nov 9th, 2013
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 5.83 KB | None | 0 0
  1. {Движение закрашенного полукруга по кромке экрана с повторотом на 90 градусов в углах}
  2.  
  3. uses
  4.   GraphABC;
  5.  
  6.   const
  7.   init_alpha1 = 0;
  8.   init_alpha2 = 180;
  9.   radius = 20;
  10.  
  11. type
  12. {------------------------------------------}
  13. {---------------Класс Point----------------}
  14. {------------------------------------------}
  15.   Point = class
  16.   protected
  17.     x:integer := 1;{координаты}
  18.     y:integer := 1;
  19.     cl:Color := clDarkBlue;{цвет}
  20.     isVisible : boolean := false;{видимость}
  21.   public
  22.     constructor Create(cx,cy:integer);
  23.     procedure Show;virtual;
  24.     procedure Hide;virtual;
  25.     procedure Move(cx,cy:integer);
  26.     procedure ChangeColor(Clr:Color);
  27.     {Т.к. здесь память управляется сборщиком мусора,}
  28.     {деструктор не обязателен}
  29.   end;
  30. {------------------------------------------}
  31. {----------------Класс SemiCircle-----------------}
  32. {------------------------------------------}
  33.   SemiCircle = class(Point)
  34.   protected
  35.     radius: Integer;
  36.     alpha1, alpha2: word;
  37.     isFill: boolean := true;{закрашен или нет}
  38.   public
  39.     constructor Create(cx, cy, r: integer);
  40.     procedure Show; override;
  41.     procedure Hide; override;
  42.     procedure Turn(new_alpha1, new_alpha2: word);
  43.     procedure ChangeFullness(isF: boolean);
  44.     {Т.к. здесь память управляется сборщиком мусора,}
  45.     {деструктор не обязателен}
  46.   end;
  47. {------------------------------------------}
  48. {-----------Методы класса Point------------}
  49. {------------------------------------------}
  50. constructor Point.Create(cx, cy: integer);
  51. begin
  52.   if(x > 0) and (y > 0) then
  53.   begin
  54.     x := cx;
  55.     y := cy;
  56.   end;
  57. end;
  58. {------------------------------------------}
  59. procedure Point.Show();
  60. begin
  61.   SetPixel(x, y, cl);
  62.   isVisible := true;
  63. end;
  64. {------------------------------------------}
  65. procedure Point.Hide;
  66. begin
  67.   SetPixel(x, y, clWhite);{цвет фона - белый}
  68.   isVisible := false;
  69. end;
  70. {------------------------------------------}
  71. procedure Point.Move(cx, cy: integer);
  72. begin
  73.   if isVisible then
  74.   begin
  75.     Hide;
  76.     isVisible := true;
  77.   end;
  78.   if(x > 0) and (y > 0) then
  79.   begin
  80.     x := cx;
  81.     y := cy;
  82.   end;
  83.   if isVisible then
  84.     Show;
  85. end;
  86. {------------------------------------------}
  87. procedure Point.ChangeColor(Clr: Color);
  88. begin
  89.   cl := Clr;
  90.   Show;
  91. end;
  92. {------------------------------------------}
  93. {------------Методы класса SemiCircle-------------}
  94. {------------------------------------------}
  95. constructor SemiCircle.Create(cx, cy, r: integer);
  96. begin
  97.   inherited Create(cx, cy); {Вызов конструктора Point.Create}
  98.   if (r > 0) then
  99.   begin
  100.     radius := r;
  101.     alpha1:=init_alpha1;
  102.     alpha2:=init_alpha2;
  103.   end;
  104. end;
  105. {------------------------------------------}
  106. procedure SemiCircle.Show();
  107. begin
  108.   if isFill then
  109.   begin
  110.     SetBrushColor(cl);{цвет заполнененного полукруга}
  111.     FillPie(x, y, radius, alpha1, alpha1);
  112.   end
  113.   else
  114.   begin
  115.     SetPenColor(cl);{цвет полого полукруга}
  116.     DrawPie(x, y, radius, alpha1, alpha1);
  117.   end;
  118.   isVisible := true;
  119. end;
  120. {------------------------------------------}
  121. procedure SemiCircle.Hide();
  122. begin
  123.   if isFill then
  124.   begin
  125.     SetBrushColor(clWhite);{цвет фона - белый}
  126.     FillPie(x, y, radius, alpha1, alpha1);
  127.   end
  128.   else
  129.   begin
  130.     SetPenColor(clWhite);{цвет фона - белый}
  131.     DrawPie(x, y, radius, alpha1, alpha1);
  132.   end;
  133.   isVisible := false;
  134. end;
  135. {------------------------------------------}
  136. procedure SemiCircle.Turn(new_alpha1, new_alpha2: word);
  137. begin
  138. alpha1:=new_alpha1;
  139. alpha2:=new_alpha2;
  140. end;
  141.  
  142. {------------------------------------------}
  143. procedure SemiCircle.ChangeFullness(isF: boolean);
  144. begin
  145.   isFill := isF;
  146. end;
  147. {------------------------------------------}
  148. {-------------Тело программы---------------}
  149. {------------------------------------------}
  150. var
  151.   b: SemiCircle; {здесь класс - ссылочный тип, т.е. b на самом деле
  152.           {является указателем на экземпляр класса.}
  153.   x, y, i: integer;
  154.   alpha1, alpha2: word;
  155.  
  156. begin
  157.   TextOut(1, 1, 'Движение закрашенного полукруга по кромке экрана с повторотом на 90 градусов в углах');
  158.   b := SemiCircle.Create(WindowWidth-radius, radius, radius);{Вызов конструктора, выделение памяти}
  159.   b.Show;
  160.   y := 40; {располагаем полукруг под текстом}
  161.   for i := 1 to 50 do {Демонстрация 50 раз}
  162.   begin
  163.     {пока не дойдём до правого края}
  164.     while(x < WindowWidth + b.radius) do
  165.     begin
  166.       x := x + 1; {Вычисляем координаты}
  167.       b.Move(x, y);{Перемещаем полукруг}
  168.       sleep(10);{задержка, чтобы успеть всё это увидеть}
  169.     end;
  170.    
  171.     alpha1:=alpha1+90;
  172.     alpha2:=alpha2+90;
  173.     b.Turn(alpha1, alpha2);
  174.    
  175.     while (y + b.radius < WindowHeight) do
  176.     begin
  177.     y:=y+1;
  178.     b.Move(x, y);
  179.     sleep(10);
  180.     end;
  181.    
  182.     alpha1:=alpha1+90;
  183.     alpha2:=alpha2+90;
  184.     b.Turn(alpha1, alpha2);
  185.    
  186.     while(x + b.radius > 40) do
  187.     begin
  188.       x := x - 1;
  189.       b.Move(x, y);
  190.       sleep(10);
  191.     end;
  192.    
  193.     alpha1:=alpha1+90;
  194.     alpha2:=alpha2+90;
  195.     b.Turn(alpha1, alpha2);
  196.    
  197.     while(y > 40) do
  198.     begin
  199.     y := y - 1;
  200.       b.Move(x, y);
  201.       sleep(8);
  202.       end;
  203.    
  204.     alpha1:=init_alpha1;
  205.     alpha2:=init_alpha2;
  206.     b.Turn(alpha1, alpha2);
  207.    
  208.   end;
  209. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement