/*
==============================================================================
WordUp Graphics Toolkit Version 5.0
Demonstration Program 23
Makes a large 256 color, animating mouse cursor!
*** PROJECT ***
This program requires the files WSPR_WC.LIB and WGT5_WC.LIB to be linked.
*** DATA FILES ***
Make sure that MOUSE.SPR is in your executable directory.
WATCOM C++ VERSION
==============================================================================
*/
#include <stdio.h>
#include <dos.h>
#include <conio.h>
#include <stdlib.h>
#include <malloc.h>
#include <wgt5.h>
#include <wgtspr.h>
#define SPRITES 20 // We're loading 20 sprites
short i; // Generic counter
color palette[256]; // Our palette
block sprites[21]; // Pointers to sprites
short quit; // if quit !=0, program quits
short oldmode; // Stores initial video mode
void looper(void); // Function to move cursor
void main(void)
{
if ( !vgadetected () )
{
printf("Error - VGA card required for any WGT program.\n");
exit (0);
}
printf ("WGT Example #23\n\n");
printf ("Many times you will find the need to use a 256 color mouse cursor.\n");
printf ("This program replaces the standard arrow with an animating image\n");
printf ("(which is simply a bitmap displayed at the mouse coordinates).\n");
printf ("This technique must be used in SVGA when the mouse driver doesn't\n");
printf ("support higher resolutions (the coords must be scaled as well).\n");
printf ("A keypress ends the demo\n");
printf ("\n\nPress any key to continue.\n");
getch ();
oldmode = wgetmode ();
vga256 ();
/* Load our sprites from the file. Palette is loaded too */
wloadsprites (palette, "mouse.spr", sprites, 0, 20);
wsetpalette (0, 255, palette);
/* Initialize the WGT sprite system */
initialize_sprites (sprites);
maxsprite = 1; /* number of sprites on */
minit (); /* initialize mouse */
for (i = 0; i < 200; i++) /* draw a background */
{
wsetcolor (i);
wline (0, i, 159, i);
wline (160, 199 - i, 319, 199 - i);
}
wcopyscreen (0, 0, 319, 199, NULL, 0, 0, spritescreen);
wcopyscreen (0, 0, 319, 199, NULL, 0, 0, backgroundscreen);
/* when using sprites, whatever is on the visual page must be on
spritescreen and backgroundscreen too! */
/* Also, you must make sure you turn a sprite on AFTER you draw
the background or it will leave a black spot where the sprite
is first shown. */
spriteon (0, 160, 100, 1); /* turn on any sprites */
animate (0, "(1,30)(2,30)(3,30)(4,30)(3,30)(2,30)R");
animon (0);
/* animate the sprite */
do {
looper (); /* Position cursor where mouse is */
} while (!quit);
getch ();
spriteoff (0); /* turn off sprites */
/* To be safe, turn off all sprites before ending your program.
This will free any memory used from them. */
deinitialize_sprites ();
mdeinit (); /* Deinitialize the mouse handler */
wfreesprites (sprites, 0, 20); /* free memory */
wsetmode (oldmode); /* restore old video mode */
}
void looper(void)
{
erase_sprites (); /* clear the sprites */
s[0].x = mouse.mx; /* any direct sprite movements must be placed */
s[0].y = mouse.my; /* between erasespr and drawspr */
/* This will place sprite number 1 where the mouse cursor is. */
wretrace ();
draw_sprites (1); /* draw them back on */
if (kbhit ())
quit = 1;
}