[Back to MOUSE SWAG index] [Back to Main SWAG index] [Original]
(* ************************************************************************
Example of ANIVGA sprite mouse using the default TurboVision Drivers unit.
Procedures in Drivers unit divide MouseInt coordinates (i.e. SAR 3) by 8 to
convert into TPoint screen coordinates. TPoint is an object containing a
pair of Integers. Consequently, the default mouse is pixel precise for X =
0..79 and Y = 0..24 but should be scaled back up for a larger range.
Changing the source code from the Drivers unit is best approach. Make a
clone unit that has the same keyboard/mouse constants and routines for the
event-loop. And ignore the rest. Otherwise multiply TEvent.Where values
by 8 repeatedly. As shown, precision is reduced to 8 pixels as a result.
************************************************************************ *)
{$A+,B-,D+,L+,N-,E-,O-,R-,S-,V-,G-,F-,I-,X-}
{$M 16384,0,655360}
PROGRAM SpriteMouse;
{ Author: John Howard jh
Version 0.4
Date: July 23, 1994
}
USES {original sinusoid code from Kai Rohrbacher}
ANIVGA
,Drivers; {TurboVision event-driven mouse & keyboard}
CONST LoadNumber=42;
TileName='AEGYPTEN.COD'; {Path & name of any sprite tile to load}
FirstTile=0;
Tiles_per_Row=2; {TileWidth}
Tiles_per_Column=2; {TileHeight}
SpriteName='FLOWER.COD'; {Path & name of any sprite to load}
CartoonName='HANTEL.LIB'; {Path & name of animated mouse cursor library}
CartoonHandle=1;
Cartoon=1; {sprite number}
MouseHandle=LoadNumber; {Clone mouse cursor}
Mouse=0; {sprite number}
Surf=Mouse +15; {just a sprite number above split index}
OFF=0; {Switch sprite OFF}
VAR
x : INTEGER;
Event : TEvent; {Drivers}
MaxFrame : word;
FrameCount : word;
CONST
{ CRT Foreground and background color constants }
Black = 0;
Blue = 1;
Green = 2;
Cyan = 3;
Red = 4;
Magenta = 5;
Brown = 6;
LightGray = 7;
{ CRT Foreground color constants }
DarkGray = 8;
LightBlue = 9;
LightGreen = 10;
LightCyan = 11;
LightRed = 12;
LightMagenta = 13;
Yellow = 14;
White = 15;
BEGIN
IF loadSprite(SpriteName,LoadNumber)=0
THEN BEGIN
WRITELN('Couldn''t access file '+SpriteName+' : '+GetErrorMessage);
halt(1)
END;
MaxFrame:=loadSprite(CartoonName,CartoonHandle);
{$IFDEF DEBUG}
writeln(CartoonName+' contains : ', MaxFrame); halt(1);
{$ENDIF}
IF Error<>Err_None
THEN BEGIN
WRITELN('Couldn''t access file '+CartoonName+' : '+GetErrorMessage);
halt(1)
END;
InitEvents; {Drivers}
HideMouse; {Drivers}
InitGraph;
IF loadTile(TileName, FirstTile)=0
THEN BEGIN
CloseRoutines;
DoneEvents; {Drivers}
WRITELN('Couldn''t access file '+TileName+' : '+GetErrorMessage);
halt(1)
END;
FillBackground(LightRed); {Border}
SetAnimateWindow(32,24, XMAX-32, YMAX-24);
SetBackgroundMode(SCROLLING); {Tiles}
SetBackgroundScrollRange(0,0,XMAX,YMAX); {Tiles}
MakeTileArea(FirstTile,Tiles_per_Row,Tiles_per_Column);
SetSplitIndex(Mouse + MaxFrame);
SetCycleTime(30); {millisec between frames}
SpriteN[Surf]:=LoadNumber;
SpriteN[Mouse]:=MouseHandle; {clone sprite for default mouse}
FrameCount := 1; {min frame number}
repeat
FOR x:=0 TO XMAX DO {vary the horizontal}
BEGIN
SpriteX[Surf]:=x; {sinusoid}
SpriteY[Surf]:=TRUNC( sin(2.0*pi*x/XMAX)*(YMAX SHR 1)+YMAX SHR 1 );
Event.What := evNothing; {ClearEvent}
GetMouseEvent(Event); {Drivers}
if (Event.What and evMouse) <> 0 then
if (Event.What = evMouseAuto) then
begin {animate mouse when button held down. Note: sporadic reporting}
SpriteN[Cartoon]:= OFF;
SpriteN[Mouse]:= OFF;
if (FrameCount < MaxFrame) then {min..max frame or restart}
inc(FrameCount) {min frame number}
else
FrameCount := 1; {start}
SpriteN[Cartoon]:= FrameCount;
SpriteX[FrameCount]:= Event.Where.X shl 3;
SpriteY[FrameCount]:= Event.Where.Y shl 3;
end
else
begin {default mouse cursor}
SpriteN[Cartoon]:= OFF;
SpriteN[Mouse]:= MouseHandle;
SpriteX[Mouse]:= Event.Where.X shl 3;
SpriteY[Mouse]:= Event.Where.Y shl 3;
end; {if}
{if "mouse (X,Y) within ClipRectangle" then}
UpdateOuterArea := 2; {Required for non-dynamic background}
Animate;
END;
GetKeyEvent(Event); {Drivers}
until (Event.What = evKeyDown); {keypressed}
CloseRoutines;
DoneEvents; {Drivers}
END.
[Back to MOUSE SWAG index] [Back to Main SWAG index] [Original]