home *** CD-ROM | disk | FTP | other *** search
/ Prima Shareware 3 / DuCom_Prima-Shareware-3_cd1.bin / PROGRAMO / delphi / SAVESCRN / BOX.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1995-06-30  |  2.4 KB  |  127 lines

  1. unit Box;
  2.  
  3. interface
  4.  
  5. uses
  6.   Forms, Graphics;
  7.  
  8. type
  9.   Directions = (ne, nw, se, sw);
  10.   TBox = class
  11.   private
  12.     x,y,linelen: Integer;
  13.     angle: Real;
  14.     dir: Directions;
  15.     Canvas: TCanvas;
  16.     procedure Check(var bChangedDir: Boolean; x,y: Integer);
  17.   public
  18.     constructor Init(C: TCanvas; LL: Integer);
  19.     procedure Draw;
  20.     procedure Rotate;
  21.   end;
  22.  
  23. implementation
  24.  
  25. constructor TBox.Init(C: TCanvas; LL: Integer);
  26. begin
  27.   Canvas := C;
  28.   linelen := LL;
  29.  
  30.   Randomize;
  31.   x := Random(Screen.Width-LL)+1;
  32.   y := Random(Screen.Height-LL)+1;
  33.   angle := 15/180*3.1415;
  34.  
  35.   dir := sw;
  36.  
  37.   Canvas.Pen.Color := clRed;
  38.   Canvas.Pen.Width := 1;
  39. end;
  40.  
  41. procedure TBox.Check(var bChangedDir: Boolean; x,y: Integer);
  42. begin
  43.   if not bChangedDir then
  44.   begin
  45.     { Check out a side }
  46.     if (x<=0) then
  47.     begin
  48.       case dir of
  49.         nw: dir := ne;
  50.         sw: dir := se;
  51.       end;
  52.       bChangedDir := True;
  53.     end;
  54.     { Check out a side }
  55.     if (x>=Screen.Width) then
  56.     begin
  57.       case dir of
  58.         ne: dir := nw;
  59.         se: dir := sw;
  60.       end;
  61.       bChangedDir := True;
  62.     end;
  63.     { Check out a side }
  64.     if (y<=0) then
  65.     begin
  66.       case dir of
  67.         nw: dir := sw;
  68.         ne: dir := se;
  69.       end;
  70.       bChangedDir := True;
  71.     end;
  72.     { Check out a side }
  73.     if (y>=Screen.Height) then
  74.     begin
  75.       case dir of
  76.         sw: dir := nw;
  77.         se: dir := ne;
  78.       end;
  79.       bChangedDir := True;
  80.     end;
  81.  
  82.   end;
  83. end;
  84.  
  85. procedure TBox.Draw;
  86. var
  87.   dx, dy: Integer;
  88.   bChangedDir: Boolean;
  89. begin
  90.   { Calculate dx and dy from angle }
  91.   dx := Round(Cos(angle) * linelen);
  92.   dy := Round(Sin(angle) * linelen);
  93.  
  94.   { Have not changed direction this time }
  95.   bChangedDir := False;
  96.  
  97.   with Canvas do
  98.   begin
  99.     MoveTo(x, y);
  100.     Check(bChangedDir, x+dx,y+dy); LineTo(x+dx,y+dy);
  101.     Check(bChangedDir, x+dx+dy,y+dx+dy); LineTo(x+dx+dy,y+dx+dy);
  102.     Check(bChangedDir, x+dy,y+dx); LineTo(x+dy,y+dx);
  103.     Check(bChangedDir, x,y); LineTo(x,y);
  104.   end;
  105. end;
  106.  
  107. procedure TBox.Rotate;
  108. begin
  109.   Canvas.Pen.Color := clBlack;
  110.   Draw;
  111.  
  112.   { Increase the angle }
  113.   angle := angle + 0.1;
  114.  
  115.   case dir of
  116.     nw: begin x := x-5; y := y-5; end;
  117.     sw: begin x := x-5; y := y+5; end;
  118.     se: begin x := x+5; y := y+5; end;
  119.     ne: begin x := x+5; y := y-5; end;
  120.   end;
  121.  
  122.   Canvas.Pen.Color := clRed;
  123.   Draw;
  124. end;
  125.  
  126. end.
  127.