]> 4ch.mooo.com Git - 16.git/blobdiff - 16/xw__/modex/DEMO01.PAS
refresh wwww
[16.git] / 16 / xw__ / modex / DEMO01.PAS
diff --git a/16/xw__/modex/DEMO01.PAS b/16/xw__/modex/DEMO01.PAS
new file mode 100755 (executable)
index 0000000..c684acd
--- /dev/null
@@ -0,0 +1,126 @@
+(*\r
+    DEMO01 - Sprites, page flipping and palette rotation\r
+    Copyright (c) 1994 Alessandro Scotti\r
+*)\r
+uses Crt, Modex;\r
+\r
+const\r
+  MAX_SPRITE = 100;\r
+type\r
+  (* Sprite structure *)\r
+  TSprite = record\r
+    X, Y : integer;                        (* Sprite coordinates *)\r
+    DX,DY: integer;                        (* Deltas for sprite movement *)\r
+    W, H : integer;                        (* Sprite width and height *)\r
+    Image: array[ 1..16, 1..16 ] of byte;  (* Sprite image data *)\r
+  end;\r
+  (* RGB color structure *)\r
+  TRgb    = record\r
+    R, G, B: byte;\r
+  end;\r
+var\r
+  S      : array[ 1..MAX_SPRITE ] of TSprite;   (* An array of sprites *)\r
+  Palette: array[ byte ] of TRgb;               (* Palette *)\r
+  Page   : word;                                (* Page offset *)\r
+  I      : word;\r
+\r
+(* Initializes a sprite structure *)\r
+procedure sxInit( var S: TSprite );\r
+var\r
+  I: word;\r
+begin\r
+  S.X := Random( 320 );  (* Initialize position with random values *)\r
+  S.Y := Random( 240 );\r
+  S.DX := Random( 7 )-3; (* Initialize speed with random values *)\r
+  S.DY := Random( 7 )-3;\r
+  S.W := 16;             (* Size is fixed in this program *)\r
+  S.H := 16;\r
+  (* The image is a square with a hole inside *)\r
+  FillChar( S.Image, SizeOf(S.Image), Random(15)+1 );\r
+  for I:=5 to 12 do FillChar( S.Image[ I, 5 ], 8, 0 );\r
+end;\r
+\r
+(* Moves a sprite *)\r
+procedure sxMove( var S: TSprite );\r
+begin\r
+  Inc( S.X, S.DX );     (* Get new position *)\r
+  Inc( S.Y, S.DY );\r
+  (* Check sprite position, change delta if needed *)\r
+  if( S.X > 320 ) then begin\r
+    S.X := 320;\r
+    S.DX := -S.DX;\r
+  end;\r
+  if( S.X < -16 ) then begin\r
+    S.X := -16;\r
+    S.DX := -S.DX;\r
+  end;\r
+  if( S.Y > 240 ) then begin\r
+    S.Y := 240;\r
+    S.DY := -S.DY;\r
+  end;\r
+  if( S.Y < -16 ) then begin\r
+    S.Y := -16;\r
+    S.DY := -S.DY;\r
+  end;\r
+  (* Draw the sprite, note the Page offset added to the *)\r
+  (* Y coordinate of the image *)\r
+  mxPutImage( @S.Image, S.X, Page+S.Y, S.W, S.H, OP_TRANS );\r
+end;\r
+\r
+begin\r
+  (* Initialize library *)\r
+  mxInit;\r
+\r
+  (* Enter graphics mode *)\r
+  mxSetMode( MX_320x240 );\r
+\r
+  (* Print initialization message *)\r
+  mxSetTextColor( 15, OP_TRANS );\r
+  mxOutStr( 4, 4, 'Initializing...' );\r
+\r
+  (* Initialize sprites *)\r
+  for I:=1 to MAX_SPRITE do sxInit( S[I] );\r
+\r
+  (* Draw background *)\r
+  for I:=1 to 192 do begin\r
+    mxCircle( 160, 480+120, I, I+63 );\r
+    mxCircle( 161, 480+120, I, I+63 );\r
+  end;\r
+\r
+  (* Compute and set palette *)\r
+  for I:=1 to 192 do with Palette[I+63] do begin\r
+    R := 0;\r
+    G := 0;\r
+    B := 0;\r
+    if( I < 64 ) then\r
+      R := I shr 1+31\r
+    else if( I < 128 ) then\r
+      G := (I-64) shr 1+31\r
+    else\r
+      B := (I-128) shr 1+31;\r
+  end;\r
+  mxSetPalette( @Palette[64], 64, 192 );\r
+\r
+  (* Main loop *)\r
+  Page := 240;\r
+  while( not KeyPressed ) do begin\r
+    (* Set clip region to current page *)\r
+    mxSetClipRegion( 0, Page, 320, 240 );\r
+    mxSetClip( TRUE );\r
+    (* Restore background *)\r
+    mxBitBlt( 0, 480, 320, 240, 0, Page );\r
+    (* Draw sprites *)\r
+    for I:=1 to MAX_SPRITE do sxMove( S[I] );\r
+    (* Print message *)\r
+    mxOutStr( 4, Page+4, 'Some sprites moving...' );\r
+    (* Flip page *)\r
+    mxStartLine( Page );\r
+    Page := 240-Page;\r
+    (* Animate palette *)\r
+    mxSetPalette( @Palette[64], 64, 192 );\r
+    mxRotatePalette( @Palette[64], 192, 3 );\r
+  end;\r
+\r
+  mxSetMode( MX_TEXT );\r
+  mxTerm;\r
+end.\r