]> 4ch.mooo.com Git - 16.git/blob - 16/xw/modex/demo01.c
9ec316f653600aa1ed5fb72b2ed456c111e5fe85
[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 uses Crt, Modex;\r
6 \r
7 #DEFINE MAX_SPRITE 100\r
8 \r
9 type\r
10         /* Sprite structure */\r
11         TSprite = record\r
12                 X, Y : integer;                                                                                         /* Sprite coordinates */\r
13                 DX,DY: integer;                                                                                         /* Deltas for sprite movement */\r
14                 W, H : integer;                                                                                         /* Sprite width and height */\r
15                 Image: array[ 1..16, 1..16 ] of byte;   /* Sprite image data */\r
16         }\r
17         /* RGB color structure */\r
18         TRgb            = record\r
19                 R, G, B: byte;\r
20         }\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 to 192 do with Palette[I+63] do begin\r
96                 R := 0;\r
97                 G := 0;\r
98                 B := 0;\r
99                 if( I < 64 ) then\r
100                         R := I shr 1+31\r
101                 else if( i < 128 )\r
102                         G := (I-64) shr 1+31\r
103                 else\r
104                         B := (I-128) shr 1+31;\r
105         }\r
106         mxSetPalette( @Palette[64], 64, 192 );\r
107 \r
108         /* Main loop */\r
109         Page := 240;\r
110         while(!kbhit())\r
111         {\r
112                 /* Set clip region to current page */\r
113                 mxSetClipRegion( 0, Page, 320, 240 );\r
114                 mxSetClip( TRUE );\r
115                 /* Restore background */\r
116                 mxBitBlt( 0, 480, 320, 240, 0, Page );\r
117                 /* Draw sprites */\r
118                 for I:=1 to MAX_SPRITE do sxMove( S[I] );\r
119                 /* Print message */\r
120                 mxOutStr( 4, Page+4, 'Some sprites moving...' );\r
121                 /* Flip page */\r
122                 mxStartLine( Page );\r
123                 Page := 240-Page;\r
124                 /* Animate palette */\r
125                 mxSetPalette( @Palette[64], 64, 192 );\r
126                 mxRotatePalette( @Palette[64], 192, 3 );\r
127         }\r
128 \r
129         mxSetMode( MX_TEXT );\r
130         mxTerm;\r
131 \r
132 }\r