home *** CD-ROM | disk | FTP | other *** search
/ Chip 1999 January / Chip_1999-01_cd.bin / zkuste / delphi / D1 / STARFLD.ZIP / MJWSTAR.PAS
Pascal/Delphi Source File  |  1997-06-17  |  12KB  |  442 lines

  1. unit mjwstar;
  2.  
  3. interface
  4.  
  5. uses
  6.   SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  7.   Forms, Dialogs, extctrls;
  8.  
  9. { TMJWstar component - version 1.00
  10.  
  11.   Copyright 1996 (c) by Michael Wilcox
  12.   All Rights Reserved.
  13.  
  14.   Email:    mwilcox@economat.demon.co.uk
  15.             michael@economatics.co.uk
  16.  
  17.   Address:  68 Upper Wortley Road
  18.             Rotherham
  19.             South Yorkshire
  20.             S61 2AD
  21.             U.K.
  22.  
  23.   This component:
  24.     - is Freeware, do not pay money for it!!!
  25.     - is used at your own risk.
  26.     - is open to amendments - please give credit.
  27.     - can be published or supplied on CD-ROM (only if not amended)
  28.  
  29.   Other components/applications I have created and released:
  30.  
  31.     TMJWstar          - Panel with moving stars as a background.
  32.                         (MJWSTAR.ZIP)
  33.                         www.delphi32.com
  34.                         Compuserve Delphi32 Forum.
  35.  
  36.     TMJWcrt           - Simulates a DOS CRT screen.
  37.                         (MJWCRT.ZIP)
  38.                         www.delphi32.com
  39.                         Compuserve Delphi32 Forum.
  40.  
  41.     MWTerm            - Terminal Emulator, Application (DOS)
  42.                         MWTERM.ZIP
  43.                         www.picksys.com
  44.  
  45.   Future components, email me if you are interested:
  46.  
  47.     TMJWcom32         - Win '95 Serial Comms.
  48.                         (SORRY - NOT RELEASED YET)
  49.  
  50.     TMJWemulator      - ADDS A2/DEBUG terminal emulator parser used with TMJWcrt.
  51.                         (SORRY - NOT RELEASED YET)
  52.  
  53.     TMJWTextScroll    - Scrolling Credits.
  54.                         (SORRY - NOT RELEASED YET)
  55.  
  56.     TMJWdigit         - Digital Numbers 0 to 9.
  57.                         (SORRY - NOT RELEASED YET)
  58.  
  59.   Thanks to:
  60.     - Matthias Laschat (STARFLD.PAS)
  61.     - Marco Cantu, "Mastering Delphi"
  62.     - Dave Jewell, PC PRO magazine.
  63.     - David P J Hill, for use of compuserve.
  64.     - Borland & TeamB (compuserve)
  65.  
  66.   Features:
  67.     - Inherited Panel component with moving stars as a background.
  68.     - Warps during design time.
  69.     - Forward and Reverse Warps. (Reverse speed eg: -20)
  70.     - Option of raised/lowered Bevels.
  71.  
  72.   Last Note:
  73.     - Please Email me if you use this component, I would value your comments.
  74.     - I feel it is wrong for developers to charge for components, they should be
  75.       written to support Borland Delphi and its users - otherwise it could be a
  76.       world of C++ and Visual Basic. It should be the completed application that
  77.       is sold - if you must make money!!!
  78.  
  79.   Thank you... enjoy...
  80.  
  81.   Amendment History - contributions with thanks:
  82.       1.00        08/10/96        Michael Wilcox.
  83. }
  84.  
  85. type
  86.   TMJWStar = class(TCustomPanel)
  87.   private
  88.     { Private }
  89.     FNumberOfStars : word;
  90.     FZoom,
  91.     FSpeed     : Integer;
  92.     TStarData  : array[1..1000] of record
  93.                     x, y, z : single;
  94.                  end;
  95.     FWrapStars : Boolean;
  96.     awidth,
  97.     bwidth     : Integer;
  98.     FInterval  : integer;
  99.     FWarp      : Boolean;
  100.     Timer      : TTimer;
  101.     FWarp10    : Boolean;
  102.     procedure GenerateStars;
  103.     procedure MoveStars(mx, my, mz : integer);
  104.     procedure WrapStars;
  105.     procedure SetSpeed(i : integer);
  106.     procedure SetZoomFactor(i : integer);
  107.     procedure SetNumberOfStars(i : word);
  108.     procedure SetInterval(Value : integer);
  109.     procedure SetWarp(Onn : Boolean);
  110.     procedure TimeHit(Sender : TObject);
  111.   protected
  112.     { Protected }
  113.   public
  114.     { Public }
  115.     constructor create(Aowner : Tcomponent); override;
  116.     destructor destroy; override;
  117.     procedure paintstars;
  118.     procedure paint; override;
  119.     procedure redraw; virtual;
  120.   published
  121.     { Published }
  122.     property Width;
  123.     property Height;
  124.     property NumberOfStars : word read FNumberOfStars write SetNumberOfStars;
  125.     property ZoomFactor : Integer read FZoom write SetZoomFactor;
  126.     property Speed : Integer read FSpeed write SetSpeed;
  127.     property WarpStart : boolean read FWarp write SetWarp;
  128.     property WarpInterval : integer read FInterval write SetInterval;
  129.     property Warp10 : Boolean read Fwarp10 write Fwarp10;
  130.  
  131.     property Align;
  132.     property BevelOuter;
  133.     property BevelWidth;
  134.     property BorderStyle;
  135.     property DragCursor;
  136.     property DragMode;
  137.     property Ctl3D;
  138.     property Locked;
  139.     property ParentShowHint;
  140.     property PopupMenu;
  141.     property ShowHint;
  142.     property TabOrder;
  143.     property TabStop;
  144.     property Visible;
  145.     property OnClick;
  146.     property OnDblClick;
  147.     property OnDragDrop;
  148.     property OnDragOver;
  149.     property OnEndDrag;
  150.     property OnEnter;
  151.     property OnExit;
  152.     property OnMouseDown;
  153.     property OnMouseMove;
  154.     property OnMouseUp;
  155.     property OnResize;
  156.   end;
  157.  
  158. const
  159.  
  160.   a : longint = 200;
  161.   grays        : array[0..15] of longint=($ffffff,$ffffff,$ffffff,$ffffff,
  162.                                           $eeeeee,$dddddd,$cccccc,$bbbbbb,
  163.                                           $aaaaaa,$999999,$888888,$777777,
  164.                                           $555555,$333333,$111111,$000000);
  165.  
  166. procedure Register;
  167.  
  168. implementation
  169.  
  170.  
  171. {Create Method}
  172. constructor TMJWstar.Create(Aowner : Tcomponent);
  173. begin
  174.   inherited create(Aowner);
  175.   width := 300;
  176.   height := 200;
  177.   FNumberOfStars := 200;
  178.   FZoom := 100;
  179.   FSpeed := 20;
  180.   color := clblack;
  181.   if screen.width > 2000 then awidth := screen.width*2 else awidth := 2000;
  182.   bwidth := awidth div 2;
  183.   GenerateStars;
  184.   FInterval := 1;
  185.   FWarp := false;
  186.   FWarp10 := false;
  187. end;
  188.  
  189. {Destroy Method}
  190. destructor TMJWstar.Destroy;
  191. begin
  192.   inherited destroy;
  193. end;
  194.  
  195. {Generate Star Data}
  196. procedure TMJWstar.GenerateStars;
  197. var i : integer;
  198. begin
  199.      for i:=1 to FNumberOfStars do
  200.      with TStarData[i] do
  201.      begin
  202.          x:=integer(random(awidth))-1000;
  203.          y:=integer(random(awidth))-bwidth;
  204.          z:=integer(random(awidth));
  205.     end;
  206. end;
  207.  
  208. {Wrap Stars}
  209. procedure TMJWstar.WrapStars;
  210. var i : integer;
  211. begin
  212.     for i := 1 to FNumberOfStars do
  213.     with TStarData[i] do
  214.     begin
  215.       while x < -bwidth do x := x + awidth;
  216.       while x >  bwidth do x := x - awidth;
  217.       while y < -bwidth do y := y + awidth;
  218.       while y >  bwidth do y := y - awidth;
  219.       while z <= 0      do z := z + awidth;
  220.       while z >  awidth do z := z - awidth;
  221.     end;
  222.     FWrapStars := false;
  223. end;
  224.  
  225. {Move Stars}
  226. procedure TMJWstar.MoveStars;
  227. var i : integer;
  228. begin
  229.      for i := 1 to FNumberOfStars do
  230.      with TStarData[i] do
  231.      begin
  232.           x := x + mx;
  233.           y := y + my;
  234.           z := z + mz;
  235.      end;
  236.      FWrapStars := true;
  237. end;
  238.  
  239. {Set Speed}
  240. procedure TMJWstar.SetSpeed(i : integer);
  241. begin
  242.     FSpeed := i;
  243.   redraw;
  244. end;
  245.  
  246. {Set Zoom Factor}
  247. procedure TMJWstar.SetZoomFactor(i : integer);
  248. begin
  249.     FZoom := i;
  250.   redraw;
  251. end;
  252.  
  253. {Set Number of Stars}
  254. procedure TMJWstar.SetNumberOfStars(i : word);
  255. begin
  256.   If (i > 1000) then i := 1000;
  257.   If (i < 0)    then i := 5;
  258.     FNumberOfStars := i;
  259.   GenerateStars;
  260.   redraw;
  261. end;
  262.  
  263. {Timer Interval}
  264. procedure TMJWstar.SetInterval(Value : Integer);
  265. begin
  266.   if Value <> FInterval then
  267.   begin
  268.   Timer.Free;
  269.   Timer := Nil;
  270.   if FWarp and (Value > 0) then
  271.     begin
  272.     Timer := TTimer.Create(Self);
  273.     Timer.Interval := Value;
  274.     Timer.OnTimer := TimeHit;
  275.     end;
  276.   FInterval := Value;
  277.   end;
  278. end;
  279.  
  280. {Star timer to move stars}
  281. procedure TMJWstar.SetWarp(Onn : boolean);
  282. begin
  283.   if Onn <> FWarp then
  284.   begin
  285.   FWarp := Onn;
  286.   if not Onn then
  287.     begin
  288.     Timer.Free;
  289.     Timer := Nil;
  290.     end
  291.   else if FInterval > 0 then
  292.     begin
  293.     Timer := TTimer.Create(Self);
  294.     Timer.Interval := FInterval;
  295.     Timer.OnTimer := TimeHit;
  296.     end;
  297.   end;
  298. end;
  299.  
  300. {Paint Stars}
  301. procedure TMJWstar.paintstars;
  302. var
  303.   i : integer;
  304.   rx, ry : integer;
  305.   xmid, ymid : integer;
  306.   azoom : single;
  307.   Rect: TRect;
  308.   TopColor, BottomColor, clr: TColor;
  309. begin
  310.      if (csDesigning in ComponentState) and (Fwarp = false) then
  311.      begin
  312.            canvas.brush.color := clblack;
  313.         canvas.rectangle(0,0,width,height);
  314.      end;
  315.  
  316.      if FWrapStars then WrapStars;
  317.      azoom := FZoom/100;
  318.  
  319.      xmid := width div 2;
  320.      ymid := height div 2;
  321.  
  322.      {Draw Background Stars}
  323.        for i := 1 to (FNumberOfStars div 2) do
  324.      with TStarData[i] do
  325.      begin
  326.               rx:=round(xmid+(a*x/300)* azoom);
  327.           ry:=round(ymid+(a*y/500)* azoom);
  328.           if (ry > (ClientRect.top+BevelWidth)+1) and
  329.              (ry < (ClientRect.Bottom-BevelWidth)-1) and
  330.              (rx > (ClientRect.Left+BevelWidth)+1) and
  331.              (rx < (ClientRect.Right-BevelWidth)-1) then
  332.             canvas.pixels[rx,ry] := clWhite;
  333.        end;
  334.  
  335.      for i := (FNumberOfStars div 2)+1 to FNumberOfStars do
  336.      with TStarData[i] do
  337.      begin
  338.           if z > 0  then
  339.           begin
  340.                if Fwarp10 = true then clr := grays[random(15)]
  341.                 else clr := color;
  342.                {Remove Small Star}
  343.                rx := round(xmid+(a*x/z)* azoom);
  344.                ry := round(ymid+(a*y/z)* azoom);
  345.                if (ry > (ClientRect.top+BevelWidth)+1) and
  346.                   (ry < (ClientRect.Bottom-BevelWidth)-1) and
  347.                   (rx > (ClientRect.Left+BevelWidth)+1) and
  348.                   (rx < (ClientRect.Right-BevelWidth)-1) then
  349.                canvas.pixels[rx,ry] := clr;
  350.                if round(z*15/awidth) < 7 then
  351.                begin
  352.                     {Remove Large Star}
  353.                   if (ry > (ClientRect.top+BevelWidth)+1) and
  354.                      (ry < (ClientRect.Bottom-BevelWidth)-1) and
  355.                      (rx > (ClientRect.Left+BevelWidth)+1) and
  356.                      (rx < (ClientRect.Right-BevelWidth)-1) then
  357.                   begin
  358.                     canvas.pixels[rx,ry+1] := clr;
  359.                     canvas.pixels[rx,ry-1] := clr;
  360.                     canvas.pixels[rx+1,ry] := clr;
  361.                     canvas.pixels[rx-1,ry] := clr;
  362.                   end;
  363.                end;
  364.           end;
  365.  
  366.           x := x + 0;
  367.           y := y + 0;
  368.           z := z + (-FSpeed);
  369.           FWrapStars:=true;
  370.  
  371.           if z > 0 then
  372.           begin
  373.                {Draw Small Star}
  374.                rx := round(xmid+(a*x/z)* azoom);
  375.                ry := round(ymid+(a*y/z)* azoom);
  376.                if (ry > (ClientRect.top+BevelWidth)+1) and
  377.                   (ry < (ClientRect.Bottom-BevelWidth)-1) and
  378.                   (rx > (ClientRect.Left+BevelWidth)+1) and
  379.                   (rx < (ClientRect.Right-BevelWidth)-1) then
  380.                canvas.pixels[rx,ry] := grays[round(z*15/awidth)];
  381.                if round(z*15/awidth) < 7 then
  382.                begin
  383.                     {Draw Large Star}
  384.                   if (ry > (ClientRect.top+BevelWidth)+1) and
  385.                      (ry < (ClientRect.Bottom-BevelWidth)-1) and
  386.                      (rx > (ClientRect.Left+BevelWidth)+1) and
  387.                      (rx < (ClientRect.Right-BevelWidth)-1) then
  388.                   begin
  389.                     canvas.pixels[rx,ry+1] := grays[round(z*15/awidth)];
  390.                     canvas.pixels[rx,ry-1] := grays[round(z*15/awidth)];
  391.                     canvas.pixels[rx+1,ry] := grays[round(z*15/awidth)];
  392.                     canvas.pixels[rx-1,ry] := grays[round(z*15/awidth)];
  393.                   end;
  394.                end;
  395.           end;
  396.     end;
  397.   {Display Bevel}
  398.   Rect := GetClientRect;
  399.   if BevelOuter <> bvNone then
  400.   begin
  401.     TopColor := clBtnHighlight;
  402.     if BevelOuter = bvLowered then TopColor := clBtnShadow;
  403.     BottomColor := clBtnShadow;
  404.     if BevelOuter = bvLowered then BottomColor := clBtnHighlight;
  405.     Frame3D(Canvas, Rect, TopColor, BottomColor, BevelWidth);
  406.   end;
  407. end;
  408.  
  409. {paint}
  410. procedure TMJWstar.paint;
  411. begin
  412.     canvas.brush.color := clblack;
  413.   canvas.rectangle(0,0,width,height);
  414.   paintstars;
  415. end;
  416.  
  417. {Redraw}
  418. procedure TMJWstar.redraw;
  419. begin
  420.   paint;
  421. end;
  422.  
  423. {Respond to timer by calling Paint method}
  424. procedure TMJWstar.TimeHit(Sender : TObject);
  425. begin
  426.     if FWarp then
  427.   begin
  428.       paintstars;
  429.   end else
  430.   begin
  431.       Timer.Free;
  432.     Timer := Nil;
  433.   end;
  434. end;
  435.  
  436. procedure Register;
  437. begin
  438.   RegisterComponents('Third Party', [TMJWstar]);
  439. end;
  440.  
  441. end.
  442.