]> 4ch.mooo.com Git - 16.git/blob - 16/xw/modex/demo01.c
wwww
[16.git] / 16 / xw / modex / demo01.c
1 /*\r
2  *              DEMO01 - Sprites, page flipping and palette rotation\r
3  *              Copyright (c) 1994 Alessandro Scotti\r
4  */\r
5 #include ../../x/modex.h\r
6 \r
7 #DEFINE MAX_SPRITE 100\r
8 \r
9 typedef unsigned char byte;\r
10 typedef unsigned short word;\r
11 typedef unsigned long  dword;\r
12 \r
13 /* Sprite structure */\r
14 typedef struct {\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
19 } TSprite;\r
20 \r
21 /* RGB color structure */\r
22 typedef struct {\r
23         byte R, G, B;\r
24 } TRgb;\r
25 Tsprite S[MAX_SPRITE];   /* An array of sprites */\r
26 TRgb Palette[ byte ];                                                    /* Palette */\r
27 word Page;                                                                                                                              /* Page offset */\r
28 word i;\r
29 \r
30 /* Initializes a sprite structure */\r
31 void sxInit(TSprite *S)\r
32 {\r
33 //word i;\r
34 \r
35 S->X = rand( 320 );     /* Initialize position with random values */\r
36 S->Y = rand( 240 );\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
40 S->H = 16;\r
41 /* The image is a square with a hole inside */\r
42 FillChar( S->Image, SizeOf(S->Image), rand(15)+1 );\r
43         for(i=5; i<=12;i++)\r
44         {\r
45                 FillChar( S->Image[ i, 5 ], 8, 0 );\r
46         }\r
47 }\r
48 \r
49 /* Moves a sprite */\r
50 void sxMove(TSprite *S)\r
51 {\r
52 //Inc( S.X, S.DX );              /* Get new position */\r
53 //Inc( S.Y, S.DY );\r
54 /* Check sprite position, change delta if needed */\r
55 if( S->X > 320 ){\r
56         S->X = 320;\r
57 S->DX = -S->DX;\r
58 }\r
59 if( S->X < -16 ){\r
60         S->X = -16;\r
61 S->DX = -S->DX;\r
62 }\r
63 if( S->Y > 240 ){\r
64         S.Y = 240;\r
65         S->DY = -S->DY;\r
66 }\r
67 if( S->Y < -16 ){\r
68         S->Y = -16;\r
69         S->DY = -S->DY;\r
70 }\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
74 }\r
75 \r
76 void main()\r
77 {\r
78         int i;\r
79         //TSprite S;\r
80         /* Initialize library */\r
81         mxInit();\r
82         \r
83         /* Enter graphics mode */\r
84         mxSetMode( MX_320x240 );\r
85         \r
86         /* Print initialization message */\r
87         mxSetTextColor( 15, OP_TRANS );\r
88         mxOutStr( 4, 4, 'Initializing...' );\r
89         \r
90         /* Initialize sprites */\r
91         for(i=1;i<=MAX_SPRITE;i++)\r
92                 sxInit( &S[i] );\r
93         \r
94         /* Draw background */\r
95         for(i=1;i<=192;i++)\r
96         {\r
97                 mxCircle( 160, 480+120, I, I+63 );\r
98                 mxCircle( 161, 480+120, I, I+63 );\r
99         }\r
100         \r
101         /* Compute and set palette */\r
102         for(i=1;i<= 192;Palette[i+63])\r
103         {\r
104                 short R = 0;\r
105                 short G = 0;\r
106                 short B = 0;\r
107                 if( i < 64 )\r
108                         R = i >> 1+31;\r
109                 else if( i < 128 )\r
110                         G = (i-64) >> 1+31;\r
111                 else\r
112                         B = (i-128) >> 1+31;\r
113         }\r
114         mxSetPalette( @Palette[64], 64, 192 );\r
115         \r
116         /* Main loop */\r
117         short Page = 240;\r
118         while(!kbhit())\r
119         {\r
120                 /* Set clip region to current page */\r
121                 mxSetClipRegion( 0, Page, 320, 240 );\r
122                 mxSetClip( TRUE );\r
123                 /* Restore background */\r
124                 mxBitBlt( 0, 480, 320, 240, 0, Page );\r
125                 /* Draw sprites */\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
129                 /* Flip page */\r
130                 mxStartLine( Page );\r
131                 Page = 240-Page;\r
132                 /* Animate palette */\r
133                 mxSetPalette( @Palette[64], 64, 192 );\r
134                 mxRotatePalette( @Palette[64], 192, 3 );\r
135         }\r
136         \r
137         mxSetMode( MX_TEXT );\r
138         mxTerm;\r
139         \r
140 }\r