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