unit mjwstar; interface uses SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Dialogs, extctrls; { TMJWstar component - version 1.00 Copyright 1996 (c) by Michael Wilcox All Rights Reserved. Email: mwilcox@economat.demon.co.uk michael@economatics.co.uk Address: 68 Upper Wortley Road Rotherham South Yorkshire S61 2AD U.K. This component: - is Freeware, do not pay money for it!!! - is used at your own risk. - is open to amendments - please give credit. - can be published or supplied on CD-ROM (only if not amended) Other components/applications I have created and released: TMJWstar - Panel with moving stars as a background. (MJWSTAR.ZIP) www.delphi32.com Compuserve Delphi32 Forum. TMJWcrt - Simulates a DOS CRT screen. (MJWCRT.ZIP) www.delphi32.com Compuserve Delphi32 Forum. MWTerm - Terminal Emulator, Application (DOS) MWTERM.ZIP www.picksys.com Future components, email me if you are interested: TMJWcom32 - Win '95 Serial Comms. (SORRY - NOT RELEASED YET) TMJWemulator - ADDS A2/DEBUG terminal emulator parser used with TMJWcrt. (SORRY - NOT RELEASED YET) TMJWTextScroll - Scrolling Credits. (SORRY - NOT RELEASED YET) TMJWdigit - Digital Numbers 0 to 9. (SORRY - NOT RELEASED YET) Thanks to: - Matthias Laschat (STARFLD.PAS) - Marco Cantu, "Mastering Delphi" - Dave Jewell, PC PRO magazine. - David P J Hill, for use of compuserve. - Borland & TeamB (compuserve) Features: - Inherited Panel component with moving stars as a background. - Warps during design time. - Forward and Reverse Warps. (Reverse speed eg: -20) - Option of raised/lowered Bevels. Last Note: - Please Email me if you use this component, I would value your comments. - I feel it is wrong for developers to charge for components, they should be written to support Borland Delphi and its users - otherwise it could be a world of C++ and Visual Basic. It should be the completed application that is sold - if you must make money!!! Thank you... enjoy... Amendment History - contributions with thanks: 1.00 08/10/96 Michael Wilcox. } type TMJWStar = class(TCustomPanel) private { Private } FNumberOfStars : word; FZoom, FSpeed : Integer; TStarData : array[1..1000] of record x, y, z : single; end; FWrapStars : Boolean; awidth, bwidth : Integer; FInterval : integer; FWarp : Boolean; Timer : TTimer; FWarp10 : Boolean; procedure GenerateStars; procedure MoveStars(mx, my, mz : integer); procedure WrapStars; procedure SetSpeed(i : integer); procedure SetZoomFactor(i : integer); procedure SetNumberOfStars(i : word); procedure SetInterval(Value : integer); procedure SetWarp(Onn : Boolean); procedure TimeHit(Sender : TObject); protected { Protected } public { Public } constructor create(Aowner : Tcomponent); override; destructor destroy; override; procedure paintstars; procedure paint; override; procedure redraw; virtual; published { Published } property Width; property Height; property NumberOfStars : word read FNumberOfStars write SetNumberOfStars; property ZoomFactor : Integer read FZoom write SetZoomFactor; property Speed : Integer read FSpeed write SetSpeed; property WarpStart : boolean read FWarp write SetWarp; property WarpInterval : integer read FInterval write SetInterval; property Warp10 : Boolean read Fwarp10 write Fwarp10; property Align; property BevelOuter; property BevelWidth; property BorderStyle; property DragCursor; property DragMode; property Ctl3D; property Locked; property ParentShowHint; property PopupMenu; property ShowHint; property TabOrder; property TabStop; property Visible; property OnClick; property OnDblClick; property OnDragDrop; property OnDragOver; property OnEndDrag; property OnEnter; property OnExit; property OnMouseDown; property OnMouseMove; property OnMouseUp; property OnResize; end; const a : longint = 200; grays : array[0..15] of longint=($ffffff,$ffffff,$ffffff,$ffffff, $eeeeee,$dddddd,$cccccc,$bbbbbb, $aaaaaa,$999999,$888888,$777777, $555555,$333333,$111111,$000000); procedure Register; implementation {Create Method} constructor TMJWstar.Create(Aowner : Tcomponent); begin inherited create(Aowner); width := 300; height := 200; FNumberOfStars := 200; FZoom := 100; FSpeed := 20; color := clblack; if screen.width > 2000 then awidth := screen.width*2 else awidth := 2000; bwidth := awidth div 2; GenerateStars; FInterval := 1; FWarp := false; FWarp10 := false; end; {Destroy Method} destructor TMJWstar.Destroy; begin inherited destroy; end; {Generate Star Data} procedure TMJWstar.GenerateStars; var i : integer; begin for i:=1 to FNumberOfStars do with TStarData[i] do begin x:=integer(random(awidth))-1000; y:=integer(random(awidth))-bwidth; z:=integer(random(awidth)); end; end; {Wrap Stars} procedure TMJWstar.WrapStars; var i : integer; begin for i := 1 to FNumberOfStars do with TStarData[i] do begin while x < -bwidth do x := x + awidth; while x > bwidth do x := x - awidth; while y < -bwidth do y := y + awidth; while y > bwidth do y := y - awidth; while z <= 0 do z := z + awidth; while z > awidth do z := z - awidth; end; FWrapStars := false; end; {Move Stars} procedure TMJWstar.MoveStars; var i : integer; begin for i := 1 to FNumberOfStars do with TStarData[i] do begin x := x + mx; y := y + my; z := z + mz; end; FWrapStars := true; end; {Set Speed} procedure TMJWstar.SetSpeed(i : integer); begin FSpeed := i; redraw; end; {Set Zoom Factor} procedure TMJWstar.SetZoomFactor(i : integer); begin FZoom := i; redraw; end; {Set Number of Stars} procedure TMJWstar.SetNumberOfStars(i : word); begin If (i > 1000) then i := 1000; If (i < 0) then i := 5; FNumberOfStars := i; GenerateStars; redraw; end; {Timer Interval} procedure TMJWstar.SetInterval(Value : Integer); begin if Value <> FInterval then begin Timer.Free; Timer := Nil; if FWarp and (Value > 0) then begin Timer := TTimer.Create(Self); Timer.Interval := Value; Timer.OnTimer := TimeHit; end; FInterval := Value; end; end; {Star timer to move stars} procedure TMJWstar.SetWarp(Onn : boolean); begin if Onn <> FWarp then begin FWarp := Onn; if not Onn then begin Timer.Free; Timer := Nil; end else if FInterval > 0 then begin Timer := TTimer.Create(Self); Timer.Interval := FInterval; Timer.OnTimer := TimeHit; end; end; end; {Paint Stars} procedure TMJWstar.paintstars; var i : integer; rx, ry : integer; xmid, ymid : integer; azoom : single; Rect: TRect; TopColor, BottomColor, clr: TColor; begin if (csDesigning in ComponentState) and (Fwarp = false) then begin canvas.brush.color := clblack; canvas.rectangle(0,0,width,height); end; if FWrapStars then WrapStars; azoom := FZoom/100; xmid := width div 2; ymid := height div 2; {Draw Background Stars} for i := 1 to (FNumberOfStars div 2) do with TStarData[i] do begin rx:=round(xmid+(a*x/300)* azoom); ry:=round(ymid+(a*y/500)* azoom); if (ry > (ClientRect.top+BevelWidth)+1) and (ry < (ClientRect.Bottom-BevelWidth)-1) and (rx > (ClientRect.Left+BevelWidth)+1) and (rx < (ClientRect.Right-BevelWidth)-1) then canvas.pixels[rx,ry] := clWhite; end; for i := (FNumberOfStars div 2)+1 to FNumberOfStars do with TStarData[i] do begin if z > 0 then begin if Fwarp10 = true then clr := grays[random(15)] else clr := color; {Remove Small Star} rx := round(xmid+(a*x/z)* azoom); ry := round(ymid+(a*y/z)* azoom); if (ry > (ClientRect.top+BevelWidth)+1) and (ry < (ClientRect.Bottom-BevelWidth)-1) and (rx > (ClientRect.Left+BevelWidth)+1) and (rx < (ClientRect.Right-BevelWidth)-1) then canvas.pixels[rx,ry] := clr; if round(z*15/awidth) < 7 then begin {Remove Large Star} if (ry > (ClientRect.top+BevelWidth)+1) and (ry < (ClientRect.Bottom-BevelWidth)-1) and (rx > (ClientRect.Left+BevelWidth)+1) and (rx < (ClientRect.Right-BevelWidth)-1) then begin canvas.pixels[rx,ry+1] := clr; canvas.pixels[rx,ry-1] := clr; canvas.pixels[rx+1,ry] := clr; canvas.pixels[rx-1,ry] := clr; end; end; end; x := x + 0; y := y + 0; z := z + (-FSpeed); FWrapStars:=true; if z > 0 then begin {Draw Small Star} rx := round(xmid+(a*x/z)* azoom); ry := round(ymid+(a*y/z)* azoom); if (ry > (ClientRect.top+BevelWidth)+1) and (ry < (ClientRect.Bottom-BevelWidth)-1) and (rx > (ClientRect.Left+BevelWidth)+1) and (rx < (ClientRect.Right-BevelWidth)-1) then canvas.pixels[rx,ry] := grays[round(z*15/awidth)]; if round(z*15/awidth) < 7 then begin {Draw Large Star} if (ry > (ClientRect.top+BevelWidth)+1) and (ry < (ClientRect.Bottom-BevelWidth)-1) and (rx > (ClientRect.Left+BevelWidth)+1) and (rx < (ClientRect.Right-BevelWidth)-1) then begin canvas.pixels[rx,ry+1] := grays[round(z*15/awidth)]; canvas.pixels[rx,ry-1] := grays[round(z*15/awidth)]; canvas.pixels[rx+1,ry] := grays[round(z*15/awidth)]; canvas.pixels[rx-1,ry] := grays[round(z*15/awidth)]; end; end; end; end; {Display Bevel} Rect := GetClientRect; if BevelOuter <> bvNone then begin TopColor := clBtnHighlight; if BevelOuter = bvLowered then TopColor := clBtnShadow; BottomColor := clBtnShadow; if BevelOuter = bvLowered then BottomColor := clBtnHighlight; Frame3D(Canvas, Rect, TopColor, BottomColor, BevelWidth); end; end; {paint} procedure TMJWstar.paint; begin canvas.brush.color := clblack; canvas.rectangle(0,0,width,height); paintstars; end; {Redraw} procedure TMJWstar.redraw; begin paint; end; {Respond to timer by calling Paint method} procedure TMJWstar.TimeHit(Sender : TObject); begin if FWarp then begin paintstars; end else begin Timer.Free; Timer := Nil; end; end; procedure Register; begin RegisterComponents('Mick', [TMJWstar]); end; end.