X-Git-Url: http://4ch.mooo.com/gitweb/?a=blobdiff_plain;f=16%2Fxw%2Fmodex%2Fdemo01.c;h=0c9f3b0205cfd95047f973946f9e2bb84bfadae6;hb=734addea4c40d2e7fb6470bdf51ce96343a25e59;hp=0908fdf4258ece42457d4b77788f3f76230e50a5;hpb=a2c9fecb49f628620e6e11450864ded097cc3f96;p=16.git diff --git a/16/xw/modex/demo01.c b/16/xw/modex/demo01.c index 0908fdf4..0c9f3b02 100755 --- a/16/xw/modex/demo01.c +++ b/16/xw/modex/demo01.c @@ -1,125 +1,140 @@ /* - DEMO01 - Sprites, page flipping and palette rotation - Copyright (c) 1994 Alessandro Scotti -*/ -uses Crt, Modex; + * DEMO01 - Sprites, page flipping and palette rotation + * Copyright (c) 1994 Alessandro Scotti + */ +#include ../../x/modex.h #DEFINE MAX_SPRITE 100 -type - (* Sprite structure *) - TSprite = record - X, Y : integer; (* Sprite coordinates *) - DX,DY: integer; (* Deltas for sprite movement *) - W, H : integer; (* Sprite width and height *) - Image: array[ 1..16, 1..16 ] of byte; (* Sprite image data *) - end; - (* RGB color structure *) - TRgb = record - R, G, B: byte; - end; -var - S : array[ 1..MAX_SPRITE ] of TSprite; (* An array of sprites *) - Palette: array[ byte ] of TRgb; (* Palette *) - Page : word; (* Page offset *) - I : word; -(* Initializes a sprite structure *) -procedure sxInit( var S: TSprite ); -var - I: word; -begin - S.X := Random( 320 ); (* Initialize position with random values *) - S.Y := Random( 240 ); - S.DX := Random( 7 )-3; (* Initialize speed with random values *) - S.DY := Random( 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), Random(15)+1 ); - for I:=5 to 12 do FillChar( S.Image[ I, 5 ], 8, 0 ); -end; +typedef unsigned char byte; +typedef unsigned short word; +typedef unsigned long dword; -(* Moves a sprite *) -procedure sxMove( var S: TSprite ); -begin - Inc( S.X, S.DX ); (* Get new position *) - Inc( S.Y, S.DY ); - (* Check sprite position, change delta if needed *) - if( S.X > 320 ) then begin - S.X := 320; - S.DX := -S.DX; - end; - if( S.X < -16 ) then begin - S.X := -16; - S.DX := -S.DX; - end; - if( S.Y > 240 ) then begin - S.Y := 240; - S.DY := -S.DY; - end; - if( S.Y < -16 ) then begin - S.Y := -16; - S.DY := -S.DY; - end; - (* 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 ); -end; +/* 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; -begin - (* Initialize library *) - mxInit; +/* 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; - (* Enter graphics mode *) - mxSetMode( MX_320x240 ); +/* Initializes a sprite structure */ +void sxInit(TSprite *S) +{ +//word i; - (* Print initialization message *) - mxSetTextColor( 15, OP_TRANS ); - mxOutStr( 4, 4, 'Initializing...' ); +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 ); + } +} - (* Initialize sprites *) - for I:=1 to MAX_SPRITE do sxInit( S[I] ); +/* 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 ); +} - (* Draw background *) - for I:=1 to 192 do begin - mxCircle( 160, 480+120, I, I+63 ); - mxCircle( 161, 480+120, I, I+63 ); - end; - - (* Compute and set palette *) - for I:=1 to 192 do with Palette[I+63] do begin - R := 0; - G := 0; - B := 0; - if( I < 64 ) then - R := I shr 1+31 - else if( I < 128 ) then - G := (I-64) shr 1+31 - else - B := (I-128) shr 1+31; - end; - mxSetPalette( @Palette[64], 64, 192 ); - - (* Main loop *) - Page := 240; - while( not KeyPressed ) do begin - (* 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 to MAX_SPRITE do 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 ); - end; - - mxSetMode( MX_TEXT ); - mxTerm; -end. +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; + +}