/* The following example demonstrates how to set up, move and free a ** Simple Sprite. The animtools.h file included is listed at the end of ** the chapter. ** ** ssprite.c - Simple Sprite example ** ** SAS/C V5.10a ** lc -b1 -cfist -v -y ssprite.c ** blink FROM LIB:c.o ssprite.o LIB LIB:lc.lib LIB:amiga.lib TO ssprite */ #include <exec/types.h> #include <graphics/gfx.h> #include <graphics/gfxbase.h> #include <graphics/gfxmacros.h> #include <graphics/sprite.h> #include <intuition/intuitionbase.h> #include <intuition/screens.h> #include <hardware/custom.h> #include <hardware/dmabits.h> #include <libraries/dos.h> #include <clib/graphics_protos.h> #include <clib/exec_protos.h> #include <clib/intuition_protos.h> #include <clib/alib_stdio_protos.h> #include <stdlib.h> struct GfxBase *GfxBase = NULL; struct IntuitionBase *IntuitionBase = NULL; extern struct Custom far custom ; /* real boring sprite data */ UWORD chip sprite_data[ ] = { 0, 0, /* position control */ 0xffff, 0x0000, /* image data line 1, color 1 */ 0xffff, 0x0000, /* image data line 2, color 1 */ 0x0000, 0xffff, /* image data line 3, color 2 */ 0x0000, 0xffff, /* image data line 4, color 2 */ 0x0000, 0x0000, /* image data line 5, transparent */ 0x0000, 0xffff, /* image data line 6, color 2 */ 0x0000, 0xffff, /* image data line 7, color 2 */ 0xffff, 0xffff, /* image data line 8, color 3 */ 0xffff, 0xffff, /* image data line 9, color 3 */ 0, 0 /* reserved, must init to 0 0 */ }; VOID main(int argc, char **argv) { struct SimpleSprite sprite = {0}; struct ViewPort *viewport; WORD sprite_num; SHORT delta_move, ktr1, ktr2, color_reg; struct Screen *screen; int return_code; return_code = RETURN_OK; if (NULL == (GfxBase = (struct GfxBase *) OpenLibrary("graphics.library",37L))) return_code = RETURN_FAIL; else { if (NULL == (IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library",37L))) return_code = RETURN_FAIL; else { /* opened library, need a viewport to render a sprite over. */ if (NULL == (screen = OpenScreenTagList(NULL, NULL))) return_code = RETURN_FAIL; else { viewport = &screen->ViewPort; if (-1 == (sprite_num = GetSprite(&sprite, 2))) return_code = RETURN_WARN; else { /* Calculate the correct base color register number, */ /* set up the color registers. */ color_reg = 16 + ((sprite_num & 0x06) << 1); printf("color_reg=%d\n", color_reg); SetRGB4(viewport, color_reg + 1, 12, 3, 8); SetRGB4(viewport, color_reg + 2, 13, 13, 13); SetRGB4(viewport, color_reg + 3, 4, 4, 15); sprite.x = 0; /* initialize position and size info */ sprite.y = 0; /* to match that shown in sprite_data */ sprite.height = 9; /* so system knows layout of data later */ /* install sprite data and move sprite to start position. */ ChangeSprite(NULL, &sprite, (APTR)sprite_data); MoveSprite(NULL, &sprite, 30, 0); /* move the sprite back and forth. */ for ( ktr1 = 0, delta_move = 1; ktr1 < 6; ktr1++, delta_move = -delta_move) { for ( ktr2 = 0; ktr2 < 100; ktr2++) { MoveSprite( NULL, &sprite, (LONG)(sprite.x + delta_move), (LONG)(sprite.y + delta_move) ); WaitTOF(); /* one move per video frame */ /* Show the effect of turning off sprite DMA. */ if (ktr2 == 40) OFF_SPRITE ; if (ktr2 == 60) ON_SPRITE ; } } /* NOTE: if you turn off the sprite at the wrong time (when it ** is being displayed), the sprite will appear as a vertical bar ** on the screen. To really get rid of the sprite, you must ** OFF_SPRITE while it is not displayed. This is hard in a ** multi-tasking system (the solution is not addressed in ** this program). */ ON_SPRITE ; /* just to be sure */ FreeSprite((WORD)sprite_num); } (VOID) CloseScreen(screen); } CloseLibrary((struct Library *)IntuitionBase); } CloseLibrary((struct Library *)GfxBase); } exit(return_code); }