[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]