X-Git-Url: http://4ch.mooo.com/gitweb/?a=blobdiff_plain;ds=sidebyside;f=16%2Fxw%2Fmodex%2Fdemo01.c;fp=16%2Fxw%2Fmodex%2Fdemo01.c;h=0c9f3b0205cfd95047f973946f9e2bb84bfadae6;hb=47cdc66151d973d975d0e31fb8a786eb639bebdb;hp=0000000000000000000000000000000000000000;hpb=4b23f27092a9470a741e3a18261ad389fd1929db;p=16.git diff --git a/16/xw/modex/demo01.c b/16/xw/modex/demo01.c new file mode 100755 index 00000000..0c9f3b02 --- /dev/null +++ b/16/xw/modex/demo01.c @@ -0,0 +1,140 @@ +/* + * DEMO01 - Sprites, page flipping and palette rotation + * Copyright (c) 1994 Alessandro Scotti + */ +#include ../../x/modex.h + +#DEFINE MAX_SPRITE 100 + +typedef unsigned char byte; +typedef unsigned short word; +typedef unsigned long dword; + +/* Sprite structure */ +typedef struct { + int X, Y; /* Sprite coordinates */ + int DX,DY; /* Deltas for sprite movement */ + int W, H; /* Sprite width and height */ + byte Image[16,16]; /* Sprite image data */ +} TSprite; + +/* RGB color structure */ +typedef struct { + byte R, G, B; +} TRgb; +Tsprite S[MAX_SPRITE]; /* An array of sprites */ +TRgb Palette[ byte ]; /* Palette */ +word Page; /* Page offset */ +word i; + +/* Initializes a sprite structure */ +void sxInit(TSprite *S) +{ +//word i; + +S->X = rand( 320 ); /* Initialize position with random values */ +S->Y = rand( 240 ); +S->DX = rand( 7 )-3; /* Initialize speed with random values */ +S->DY = rand( 7 )-3; +S->W = 16; /* Size is fixed in this program */ +S->H = 16; +/* The image is a square with a hole inside */ +FillChar( S->Image, SizeOf(S->Image), rand(15)+1 ); + for(i=5; i<=12;i++) + { + FillChar( S->Image[ i, 5 ], 8, 0 ); + } +} + +/* Moves a sprite */ +void sxMove(TSprite *S) +{ +//Inc( S.X, S.DX ); /* Get new position */ +//Inc( S.Y, S.DY ); +/* Check sprite position, change delta if needed */ +if( S->X > 320 ){ + S->X = 320; +S->DX = -S->DX; +} +if( S->X < -16 ){ + S->X = -16; +S->DX = -S->DX; +} +if( S->Y > 240 ){ + S.Y = 240; + S->DY = -S->DY; +} +if( S->Y < -16 ){ + S->Y = -16; + S->DY = -S->DY; +} +/* Draw the sprite, note the Page offset added to the */ +/* Y coordinate of the image */ +mxPutImage( S.Image, S->X, Page+S->Y, S->W, S->H, OP_TRANS ); +} + +void main() +{ + int i; + //TSprite S; + /* Initialize library */ + mxInit(); + + /* Enter graphics mode */ + mxSetMode( MX_320x240 ); + + /* Print initialization message */ + mxSetTextColor( 15, OP_TRANS ); + mxOutStr( 4, 4, 'Initializing...' ); + + /* Initialize sprites */ + for(i=1;i<=MAX_SPRITE;i++) + sxInit( &S[i] ); + + /* Draw background */ + for(i=1;i<=192;i++) + { + mxCircle( 160, 480+120, I, I+63 ); + mxCircle( 161, 480+120, I, I+63 ); + } + + /* Compute and set palette */ + for(i=1;i<= 192;Palette[i+63]) + { + short R = 0; + short G = 0; + short B = 0; + if( i < 64 ) + R = i >> 1+31; + else if( i < 128 ) + G = (i-64) >> 1+31; + else + B = (i-128) >> 1+31; + } + mxSetPalette( @Palette[64], 64, 192 ); + + /* Main loop */ + short Page = 240; + while(!kbhit()) + { + /* Set clip region to current page */ + mxSetClipRegion( 0, Page, 320, 240 ); + mxSetClip( TRUE ); + /* Restore background */ + mxBitBlt( 0, 480, 320, 240, 0, Page ); + /* Draw sprites */ + for(i=1; i <= MAX_SPRITE; sxMove( S[i] )); + /* Print message */ + mxOutStr( 4, Page+4, 'Some sprites moving...' ); + /* Flip page */ + mxStartLine( Page ); + Page = 240-Page; + /* Animate palette */ + mxSetPalette( @Palette[64], 64, 192 ); + mxRotatePalette( @Palette[64], 192, 3 ); + } + + mxSetMode( MX_TEXT ); + mxTerm; + +}