OSDN Git Service

wwww
[proj16/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/\r
6 \r
7 #DEFINE MAX_SPRITE 100\r
8 \r
9 /* Sprite structure */\r
10 typedef struct {\r
11                 int X, Y;                                                                                               /* Sprite coordinates */\r
12                 int DX,DY;                                                                                              /* Deltas for sprite movement */\r
13                 int W, H;                                                                                               /* Sprite width and height */\r
14                 unsigned char Image[16,16];     /* Sprite image data */\r
15 } TSprite;\r
16 \r
17 /* RGB color structure */\r
18 typedef struct {\r
19                 R, G, B: byte;\r
20 } TRgb;\r
21 var\r
22         S                       : array[ 1..MAX_SPRITE ] of TSprite;     /* An array of sprites */\r
23         Palette: array[ byte ] of TRgb;                                                  /* Palette */\r
24         Page     : word;                                                                                                                                /* Page offset */\r
25         I                       : word;\r
26 \r
27 /* Initializes a sprite structure */\r
28 procedure sxInit( var S: TSprite );\r
29 var\r
30         I: word;\r
31 begin\r
32         S.X = Random( 320 );    /* Initialize position with random values */\r
33         S.Y = Random( 240 );\r
34         S.DX = Random( 7 )-3; /* Initialize speed with random values */\r
35         S.DY = Random( 7 )-3;\r
36         S.W = 16;                                                /* Size is fixed in this program */\r
37         S.H = 16;\r
38         /* The image is a square with a hole inside */\r
39         FillChar( S.Image, SizeOf(S.Image), Random(15)+1 );\r
40         for I=5 to 12 do FillChar( S.Image[ I, 5 ], 8, 0 );\r
41 }\r
42 \r
43 /* Moves a sprite */\r
44 procedure sxMove( var S: TSprite );\r
45 begin\r
46         Inc( S.X, S.DX );                /* Get new position */\r
47         Inc( S.Y, S.DY );\r
48         /* Check sprite position, change delta if needed */\r
49         if( S.X > 320 ) then begin\r
50                 S.X = 320;\r
51                 S.DX = -S.DX;\r
52         }\r
53         if( S.X < -16 ) then begin\r
54                 S.X = -16;\r
55                 S.DX = -S.DX;\r
56         }\r
57         if( S.Y > 240 ) then begin\r
58                 S.Y = 240;\r
59                 S.DY = -S.DY;\r
60         }\r
61         if( S.Y < -16 ) then begin\r
62                 S.Y = -16;\r
63                 S.DY = -S.DY;\r
64         }\r
65         /* Draw the sprite, note the Page offset added to the */\r
66         /* Y coordinate of the image */\r
67         mxPutImage( @S.Image, S.X, Page+S.Y, S.W, S.H, OP_TRANS );\r
68 }\r
69 \r
70 void main()\r
71 {\r
72         int i;\r
73         /* Initialize library */\r
74         mxInit();\r
75 \r
76         /* Enter graphics mode */\r
77         mxSetMode( MX_320x240 );\r
78 \r
79         /* Print initialization message */\r
80         mxSetTextColor( 15, OP_TRANS );\r
81         mxOutStr( 4, 4, 'Initializing...' );\r
82 \r
83         /* Initialize sprites */\r
84         for(i=1;i<=MAX_SPRITE;i++)\r
85                 sxInit( S[i] );\r
86 \r
87         /* Draw background */\r
88         for(i=1;i<=192;i++)\r
89         {\r
90                 mxCircle( 160, 480+120, I, I+63 );\r
91                 mxCircle( 161, 480+120, I, I+63 );\r
92         }\r
93 \r
94         /* Compute and set palette */\r
95         for(i=1;i<= 192;Palette[i+63])\r
96         {\r
97                 short R = 0;\r
98                 short G = 0;\r
99                 short B = 0;\r
100                 if( i < 64 )\r
101                         R = i shr 1+31\r
102                 else if( i < 128 )\r
103                         G = (i-64) shr 1+31\r
104                 else\r
105                         B = (i-128) shr 1+31;\r
106         }\r
107         mxSetPalette( @Palette[64], 64, 192 );\r
108 \r
109         /* Main loop */\r
110         short Page = 240;\r
111         while(!kbhit())\r
112         {\r
113                 /* Set clip region to current page */\r
114                 mxSetClipRegion( 0, Page, 320, 240 );\r
115                 mxSetClip( TRUE );\r
116                 /* Restore background */\r
117                 mxBitBlt( 0, 480, 320, 240, 0, Page );\r
118                 /* Draw sprites */\r
119                 for(i=1; i <= MAX_SPRITE; sxMove( S[i] ));\r
120                 /* Print message */\r
121                 mxOutStr( 4, Page+4, 'Some sprites moving...' );\r
122                 /* Flip page */\r
123                 mxStartLine( Page );\r
124                 Page = 240-Page;\r
125                 /* Animate palette */\r
126                 mxSetPalette( @Palette[64], 64, 192 );\r
127                 mxRotatePalette( @Palette[64], 192, 3 );\r
128         }\r
129 \r
130         mxSetMode( MX_TEXT );\r
131         mxTerm;\r
132 \r
133 }\r