2 * DEMO01 - Sprites, page flipping and palette rotation
\r
3 * Copyright (c) 1994 Alessandro Scotti
\r
5 #include ../../x/modex.h
\r
7 #DEFINE MAX_SPRITE 100
\r
9 typedef unsigned char byte;
\r
10 typedef unsigned short word;
\r
11 typedef unsigned long dword;
\r
13 /* Sprite structure */
\r
15 int X, Y; /* Sprite coordinates */
\r
16 int DX,DY; /* Deltas for sprite movement */
\r
17 int W, H; /* Sprite width and height */
\r
18 byte Image[16,16]; /* Sprite image data */
\r
21 /* RGB color structure */
\r
25 Tsprite S[MAX_SPRITE]; /* An array of sprites */
\r
26 TRgb Palette[ byte ]; /* Palette */
\r
27 word Page; /* Page offset */
\r
30 /* Initializes a sprite structure */
\r
31 void sxInit(TSprite *S)
\r
35 S->X = rand( 320 ); /* Initialize position with random values */
\r
37 S->DX = rand( 7 )-3; /* Initialize speed with random values */
\r
38 S->DY = rand( 7 )-3;
\r
39 S->W = 16; /* Size is fixed in this program */
\r
41 /* The image is a square with a hole inside */
\r
42 FillChar( S->Image, SizeOf(S->Image), rand(15)+1 );
\r
45 FillChar( S->Image[ i, 5 ], 8, 0 );
\r
49 /* Moves a sprite */
\r
50 void sxMove(TSprite *S)
\r
52 //Inc( S.X, S.DX ); /* Get new position */
\r
54 /* Check sprite position, change delta if needed */
\r
71 /* Draw the sprite, note the Page offset added to the */
\r
72 /* Y coordinate of the image */
\r
73 mxPutImage( S.Image, S->X, Page+S->Y, S->W, S->H, OP_TRANS );
\r
80 /* Initialize library */
\r
83 /* Enter graphics mode */
\r
84 mxSetMode( MX_320x240 );
\r
86 /* Print initialization message */
\r
87 mxSetTextColor( 15, OP_TRANS );
\r
88 mxOutStr( 4, 4, 'Initializing...' );
\r
90 /* Initialize sprites */
\r
91 for(i=1;i<=MAX_SPRITE;i++)
\r
94 /* Draw background */
\r
97 mxCircle( 160, 480+120, I, I+63 );
\r
98 mxCircle( 161, 480+120, I, I+63 );
\r
101 /* Compute and set palette */
\r
102 for(i=1;i<= 192;Palette[i+63])
\r
110 G = (i-64) >> 1+31;
\r
112 B = (i-128) >> 1+31;
\r
114 mxSetPalette( @Palette[64], 64, 192 );
\r
120 /* Set clip region to current page */
\r
121 mxSetClipRegion( 0, Page, 320, 240 );
\r
123 /* Restore background */
\r
124 mxBitBlt( 0, 480, 320, 240, 0, Page );
\r
126 for(i=1; i <= MAX_SPRITE; sxMove( S[i] ));
\r
127 /* Print message */
\r
128 mxOutStr( 4, Page+4, 'Some sprites moving...' );
\r
130 mxStartLine( Page );
\r
132 /* Animate palette */
\r
133 mxSetPalette( @Palette[64], 64, 192 );
\r
134 mxRotatePalette( @Palette[64], 192, 3 );
\r
137 mxSetMode( MX_TEXT );
\r