|
|
|
|
REM. Demonstrate use of ReadAlphaChannel REM. Should be compatible with GFXLIB version 1.1.0 M% = 3 : HIMEM = LOMEM+M%*&100000 MODE 8 : OFF INSTALL @lib$+"GFXLIB" : PROCAutoInit32 REM. Set bit 0 in the alpha byte of every non-zero pixel in REM. the pre-defined 64x64 32-bpp 'demo' bitmap REM. (This rather tedious preparatory step isn't necessary in REM. GFXLIB v1.3 or later) dispVars.bmBuffAddr% = demoBm32% dispVars.bmBuffW% = 64 dispVars.bmBuffH% = 64 SYS GFXLIB_PlotOR, dispVars{}, demoBm32%, 64, 64, 0, 0, 1<<24 SYS GFXLIB_QuickSetDispVars, dispVars{}, dibSectionAddr% REM. Set up structured array of sprite object params numObjs% = 100 DIM obj{( numObjs%-1 ) active%, x%, y%, xv%, yv%} REM. Define initial sprite positions and velocities FOR I% = 0 TO numObjs%-1 obj{( I% )}.active% = TRUE obj{( I% )}.x% = RND(640 - 64) obj{( I% )}.y% = RND(512 - 64) obj{( I% )}.xv% = RND(3)-2 obj{( I% )}.yv% = RND(3)-2 NEXT I% *REFRESH OFF REPEAT SYS GFXLIB_Clr, dispVars{}, &000040 MOUSE X%, Y%, B% X% DIV= 2 : Y% DIV= 2 REM. Draw active objects and update their positions FOR I% = 0 TO numObjs%-1 IF obj{( I% )}.active% THEN SYS GFXLIB_Plot, dispVars{}, demoBm32%, 64, 64, obj{(I%)}.x%, obj{(I%)}.y% obj{(I%)}.x% += obj{( I% )}.xv% obj{(I%)}.y% += obj{( I% )}.yv% IF obj{(I%)}.x% < 0 OR obj{(I%)}.x% > 640-64 THEN obj{( I% )}.xv% *= -1 IF obj{(I%)}.y% < 0 OR obj{(I%)}.y% > 512-64 THEN obj{( I% )}.yv% *= -1 ENDIF NEXT I% REM. If left mouse button pressed, then read the alpha channel value REM. at the mouse position (X%,Y%) IF B% = 4 THEN SYS GFXLIB_ReadAlphaChannel, dispVars{}, X%, Y% TO V% REM. If V%<>0 then there's a 'collision', so which object is it? IF V% <> 0 THEN FOR I% = 0 TO numObjs%-1 IF obj{( I% )}.active% THEN IF X% >= obj{(I%)}.x% THEN IF Y% >= obj{(I%)}.y% THEN IF X% < obj{(I%)}.x%+64 THEN IF Y% < obj{(I%)}.y%+64 THEN REM. de-activate object obj{( I% )}.active% = FALSE ENDIF ENDIF ENDIF ENDIF ENDIF NEXT I% ENDIF ENDIF REM. Update screen / program window SYS "InvalidateRect", @hwnd%, 0, 0 PROCWait(4) *REFRESH UNTIL FALSE
REM. Demonstrate use of PlotTestACBit REM. Should be compatible with GFXLIB version 1.1.0 M% = 3 : HIMEM = LOMEM+M%*&100000 MODE 8 : OFF INSTALL @lib$+"GFXLIB" : PROCAutoInit32 REM. Set bit 0 in the alpha byte of every non-zero pixel in REM. the pre-defined 64x64 32-bpp 'demo' bitmap REM. (This rather tedious preparatory step isn't necessary in REM. GFXLIB v1.3 or later) dispVars.bmBuffAddr% = demoBm32% dispVars.bmBuffW% = 64 dispVars.bmBuffH% = 64 SYS GFXLIB_PlotOR, dispVars{}, demoBm32%, 64, 64, 0, 0, 1<<24 SYS GFXLIB_QuickSetDispVars, dispVars{}, dibSectionAddr% REM. Set up structured array of sprite object params numObjs% = 100 DIM obj{( numObjs%-1 ) active%, x%, y%, xv%, yv%} REM. Define initial sprite positions and velocities FOR I% = 0 TO numObjs%-1 obj{( I% )}.active% = TRUE obj{( I% )}.x% = RND(640 - 64) obj{( I% )}.y% = RND(512 - 64) obj{( I% )}.xv% = RND(3)-2 obj{( I% )}.yv% = RND(3)-2 NEXT I% *REFRESH OFF REPEAT SYS GFXLIB_Clr, dispVars{}, &000040 MOUSE X%, Y%, B% X% DIV= 2 : Y% DIV= 2 REM. Draw active objects and update their positions FOR I% = 0 TO numObjs%-1 IF obj{( I% )}.active% THEN SYS GFXLIB_Plot, dispVars{}, demoBm32%, 64, 64, obj{(I%)}.x%, obj{(I%)}.y% obj{(I%)}.x% += obj{( I% )}.xv% obj{(I%)}.y% += obj{( I% )}.yv% IF obj{(I%)}.x% < 0 OR obj{(I%)}.x% > 640-64 THEN obj{( I% )}.xv% *= -1 IF obj{(I%)}.y% < 0 OR obj{(I%)}.y% > 512-64 THEN obj{( I% )}.yv% *= -1 ENDIF NEXT I% REM. Draw collision test bitmap, checking if alpha bit 0 is set in REM. any overwritten background pixels SYS GFXLIB_PlotTestACBit, dispVars{}, demoBm32%, 64, 64, X%, Y%, 0 TO V% REM. If V%<>0 then there's a collision IF V% <> 0 THEN FOR I% = 0 TO numObjs%-1 IF obj{( I% )}.active% THEN IF X% >= obj{(I%)}.x%-64 THEN IF Y% >= obj{(I%)}.y%-64 THEN IF X% < obj{(I%)}.x%+64 THEN IF Y% < obj{(I%)}.y%+64 THEN REM. de-activate object obj{( I% )}.active% = FALSE ENDIF ENDIF ENDIF ENDIF ENDIF NEXT I% ENDIF REM. Update screen / program window SYS "InvalidateRect", @hwnd%, 0, 0 PROCWait(4) *REFRESH UNTIL FALSE
REM. PlotTestAlphaBit // Example REM. REM. Demonstrate use of PlotTestAlphaBit REM. REM. Parameters: dispVars{}, bmAddr, bmW, bmH, x, y REM. REM. PlotTestAlphaBit is an external GFXLIB module REM. Make 3MB of RAM available for this program M% = 3 HIMEM = LOMEM + M%*&100000 REM. Invoke display mode 8 (dimensions: 640x512) MODE 8 : OFF REM. Install and initialise GFXLIB core library INSTALL @lib$ + "GFXLIB13" PROCInitGFXLIB REM. Install and initialise required modules INSTALL @lib$ + "GFXLIB_modules\PlotTestAlphaBit" : PROCInitModule INSTALL @lib$ + "GFXLIB_modules\RGBSwap" : PROCInitModule INSTALL @lib$ + "GFXLIB_modules\PlotSetAlphaBit" : PROCInitModule INSTALL @lib$ + "GFXLIB_modules\RectangleOR" : PROCInitModule REM. Load the graphics REM. (they'll be converted to the required 32bpp format by PROCLoadBMP) PROCLoadBMP( @lib$ + "GFXLIB_media\bg2_640x512x24.BMP", bg%, 0 ) PROCLoadBMP( @lib$ + "GFXLIB_media\gfxlib_480x128x8.BMP", gfxlib%, 0 ) PROCLoadBMP( @lib$ + "GFXLIB_media\disc1_48x48x32.BMP", disc%, 0 ) SYS GFXLIB_RGBSwap%, gfxlib%, 480, 128, 2 REPEAT MOUSE X%, Y%, B% X% DIV= 2 Y% DIV= 2 SYS GFXLIB_BPlot%, dispVars{}, bg%, 640, 512, 0, 0 SYS GFXLIB_PlotSetAlphaBit%, dispVars{}, gfxlib%, 480, 128, (640-480)DIV2, (512-128)DIV2, 5 SYS GFXLIB_PlotTestAlphaBit%, dispVars{}, disc%, 48, 48, X%-24, Y%-24, 5 TO R% IF R% <> 0 THEN SYS GFXLIB_RectangleOR%, dispVars{}, 0, 0, 640, 16, &FF0000 SYS GFXLIB_RectangleOR%, dispVars{}, 0, 512-16, 640, 16, &FF0000 SYS GFXLIB_RectangleOR%, dispVars{}, 0, 0, 16, 512, &FF0000 SYS GFXLIB_RectangleOR%, dispVars{}, 640-16, 0, 16, 512, &FF0000 ENDIF REM. Update the screen / program window PROCdisplay UNTIL FALSE