'*
'* constants used with SL_FLIP_SPRITE subroutine
'*
'*
'* constants used with SL_NEW_SPRITE_SHEET function
'*
CONST SL_SHEETTRANSPARENCY
= -1 ' use sheet's transparency info (.PNG) CONST SL_SETTRANSPARENCY
= 0 ' manually set transparency CONST SL_NOTRANSPARENCY
= 1 ' don't use transparency with sheet
'*
'* constants used with SL_NEW_SPRITE function
'*
CONST SL_NOSAVE
= 0 ' sprite will not save background CONST SL_SAVE
= -1 ' sprite will save background
'*
'* type declarations
'*
TYPE SL_SHEET
' *********************** sprite sheet database *************************************** image
AS LONG ' software sprite image mask
AS LONG ' software mask image collx2
AS INTEGER ' collision box bottom right x colly2
AS INTEGER ' collision box bottom right y transparency
AS INTEGER ' -1 (TRUE) if sheet uses transparency
TYPE SL_SPRITE
' ********************** sprite database ********************************************* column
AS INTEGER ' the column on the sheet the sprite resides row
AS INTEGER ' the row on the sheet the sprite resides sprite
AS LONG ' hardware image image
AS LONG ' software image mask
AS LONG ' software mask image rsprite
AS LONG ' rotated sprite hardware image rimage
AS LONG ' rotated sprite software image rmask
AS LONG ' rotated sprite mask software image rspritewidth
AS INTEGER ' rotated sprite image width rspriteheight
AS INTEGER ' rotated sprite image height background
AS LONG ' background image behind sprite xreal
AS SINGLE ' x location of sprite (center point) yreal
AS SINGLE ' y location of sprite (center point) xint
AS INTEGER ' x location of sprite on screen INT(xreal) (center point) yint
AS INTEGER ' y location of sprite on screen INT(yreal) (center point) xactual
AS INTEGER ' x location of sprite on screen (upper left x) yactual
AS INTEGER ' y location of sprite on screen (upper left y) collx2
AS INTEGER ' collision box bottom right x colly2
AS INTEGER ' collision box bottom right y flip
AS INTEGER ' flip horizontally, vertically, or both rotation
AS SINGLE ' rotation angle of sprite (0 - 359.999) transparency
AS INTEGER ' -1 (TRUE) if sprite uses transparency
TYPE SL_ROTATE
'*********************** precalculated rotation table ******************************** rheight
AS INTEGER ' height of rotated sprite px0
AS INTEGER ' rectangular rotation coordinates
'*
'* defined arrays
'*
REDIM SL_sheet
(1, 1, 1) AS SL_SHEET
' master sprite sheet array REDIM SL_sprite
(1) AS SL_SPRITE
' master working sprite array REDIM SL_rotate
(1, 359) AS SL_ROTATE
' precalculated rotation values
'*
'* main code (for testing)
'*
kongsheet
= SL_NEW_SPRITE_SHEET
("dkong.png", 64, 64, SL_SETTRANSPARENCY
, _RGB32(255, 0, 255))mysprite% = SL_NEW_SPRITE(kongsheet, 1, 1, SL_NOSAVE)
mysprite2% = SL_NEW_SPRITE(kongsheet, 1, 1, SL_NOSAVE)
'SL_FLIP_SPRITE mysprite%, SL_NOFLIP
SL_PUT_SPRITE 128, 128, mysprite2%
angle
= angle
+ 1:
IF angle
= 360 THEN angle
= 0 SL_ROTATE_SPRITE mysprite%, angle
SL_PUT_SPRITE 128, 128, mysprite%
' ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
'ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
'³ °°°±±±²²²ÛÛÛ COMMAND DESCRIPTION AND USAGE ÛÛÛ²²²±±±°°° ³ °°°±±±²²²ÛÛÛ NOTES ÛÛÛ²²²±±±°°° ³
'ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
'³ ³ ³
'³ ³ ³
'ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
'³ °°°±±±²²²ÛÛÛ KNOWN ISSUES ÛÛÛ²²²±±±°°° ³ °°°±±±²²²ÛÛÛ CREDITS ÛÛÛ²²²±±±°°° ³
'ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
'³ ³ Portions of this subroutine have code based off of Galleon's RotoZoom subroutine in the QB64 ³
'³ ³ documentation at http://[abandoned, outdated and now likely malicious qb64 dot net website - don’t go there]/wiki/index.php?title=MAPTRIANGLE (link no longer works) ³
'³ ³ ³
'ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
'³ °°°±±±²²²ÛÛÛ THEORY OF OPERATION ÛÛÛ²²²±±±°°° ³
'ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
'³ ³
'³ ³
'ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
'³ °°°±±±²²²ÛÛÛ HISTORY ÛÛÛ²²²±±±°°° ³
'ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
'³ Date: 09/11/18 by Terry Ritchie ³
'³ : Initial writing of code. ³
'³ ³
'ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
' declare global variables
SHARED SL_sprite
() AS SL_SPRITE
' master working sprite array SHARED SL_rotate
() AS SL_ROTATE
' precalculated rotation table
'declare local variables
' perform error checks
IF NOT SL_VALID_SPRITE
(handle
) THEN ' is this a valid sprite? SL_ERROR "SL_ROTATE_SPRITE", 500, "" ' no, report error to programmer
' correct degree angle if needed (needs to be 0 - 359)
IF degrees
= 360 THEN ' is it 360? degrees = 0 ' yes, that's the same as 0
degrees = dgrees + 360 ' increase by 360
LOOP UNTIL degrees
> 0 ' until it's in a valid range ELSEIF degrees
> 360 THEN ' is it greater than 360? degrees = degrees - 360 ' decrease by 360
LOOP UNTIL degrees
< 360 ' until it's in a valid range SL_sprite(handle).rotation = degrees ' remember degree of rotation
SL_sprite(handle).rspritewidth = SL_rotate(SL_sprite(handle).sheet, degrees).rwidth ' get precalculated rotated sprite width
SL_sprite(handle).rspriteheight = SL_rotate(SL_sprite(handle).sheet, degrees).rheight ' get precalculated rotated sprite height
px0 = SL_rotate(SL_sprite(handle).sheet, degrees).px0 ' get precalculated polar coordinates
px1 = SL_rotate(SL_sprite(handle).sheet, degrees).px1
px2 = SL_rotate(SL_sprite(handle).sheet, degrees).px2
px3 = SL_rotate(SL_sprite(handle).sheet, degrees).px3
py0 = SL_rotate(SL_sprite(handle).sheet, degrees).py0
py1 = SL_rotate(SL_sprite(handle).sheet, degrees).py1
py2 = SL_rotate(SL_sprite(handle).sheet, degrees).py2
py3 = SL_rotate(SL_sprite(handle).sheet, degrees).py3
rw = SL_rotate(SL_sprite(handle).sheet, degrees).rwidth ' get precalculated rotated sprite width
rh = SL_rotate(SL_sprite(handle).sheet, degrees).rheight ' get precalculated rotated sprite height
sw = SL_sprite(handle).spritewidth - 1 ' get sprite width
sh = SL_sprite(handle).spriteheight - 1 ' get sprite height
IF SL_sprite
(handle
).rimage
THEN _FREEIMAGE SL_sprite
(handle
).rimage
' free rotated image if it already exists SL_sprite
(handle
).rimage
= _NEWIMAGE(rw
, rh
, 32) ' create rotated image (px0, py0)-(px1, py1)-(px2, py2), SL_sprite(handle).rimage ' map rotated sprite onto image
(px0, py0)-(px3, py3)-(px2, py2), SL_sprite(handle).rimage
IF SL_sprite
(handle
).rsprite
THEN _FREEIMAGE SL_sprite
(handle
).rsprite
' free rotated hardware sprite if it alreadt exists SL_sprite
(handle
).rsprite
= _COPYIMAGE(SL_sprite
(handle
).rimage
, 33) ' create hardware sprite of rotated image IF SL_sprite
(handle
).transparency
THEN ' does this sprite have a mask? IF SL_sprite
(handle
).rmask
THEN _FREEIMAGE SL_sprite
(handle
).rmask
' yes, free mask image if it already exists SL_sprite
(handle
).rmask
= _NEWIMAGE(rw
, rh
, 32) ' created rotated mask image (px0, py0)-(px1, py1)-(px2, py2), SL_sprite(handle).rmask ' map rotated mask onto image
(px0, py0)-(px3, py3)-(px2, py2), SL_sprite(handle).rmask
' ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
'ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
'³ °°°±±±²²²ÛÛÛ COMMAND DESCRIPTION AND USAGE ÛÛÛ²²²±±±°°° ³ °°°±±±²²²ÛÛÛ NOTES ÛÛÛ²²²±±±°°° ³
'ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
'³ Sets a sprite's flipping behavior when drawn to the screen. ³ - Four constants have been created for this subroutine: ³
'³ ³ : SL_NOFLIP (0) no flipping desired (or reset flip behavior) ³
'³ SL_FLIP_SPRITE mysprite, SL_NOFLIP ³ : SL_HORIZONTAL (1) flip sprite horizontally ³
'³ ³ : SL_VERTICAL (2) flip sprite vertically ³
'³ input : handle - the sprite to flip. ³ : SL_FLIPBOTH (3) flip sprite both horizontally and vertically ³
'³ flip - the type of flip desired: ³ - Once a flip behavior has been set it will remain in effect until the behavior is changed. ³
'³ : 0 - no flipping desired (or reset flip behavior) ³ - This subroutine will report an error on the following conditions: ³
'³ : 1 - flip sprite horizontally ³ : An invalid sprite has been requested. ³
'³ : 2 - flip sprite vertically ³ : An invalid flip behavior. ³
'³ : 3 - flip sprite both horizontally and vertically ³ ³
'³ ³ ³
'³ Sets : SL_sprite(handle).flip = flip (sets the flip behavior for later use) ³ ³
'³ ³ ³
'ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
'³ °°°±±±²²²ÛÛÛ KNOWN ISSUES ÛÛÛ²²²±±±°°° ³ °°°±±±²²²ÛÛÛ CREDITS ÛÛÛ²²²±±±°°° ³
'ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
'³ None ³ None ³
'³ ³ ³
'ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
'³ °°°±±±²²²ÛÛÛ THEORY OF OPERATION ÛÛÛ²²²±±±°°° ³
'ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
'³ A sprite array setting will be made for use by other library routines. ³
'³ ³
'ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
'³ °°°±±±²²²ÛÛÛ HISTORY ÛÛÛ²²²±±±°°° ³
'ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
'³ Date: 09/11/18 by Terry Ritchie ³
'³ : Initial writing of code. ³
'³ ³
'ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
' declare global variables
SHARED SL_sprite
() AS SL_SPRITE
' master working sprite array
' perform error checks
IF NOT SL_VALID_SPRITE
(handle
) THEN ' is this a valid sprite? SL_ERROR "SL_FLIP_SPRITE", 400, "" ' no, report error to programmer
IF flip
< 0 OR flip
> 3 THEN ' valid flip behavior requested? SL_ERROR "SL_FLIP_SPRITE", 401, "" ' no, report error to programmer
SL_sprite(handle).flip = flip ' set flipping behavior
' ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
'ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
'³ °°°±±±²²²ÛÛÛ COMMAND DESCRIPTION AND USAGE ÛÛÛ²²²±±±°°° ³ °°°±±±²²²ÛÛÛ NOTES ÛÛÛ²²²±±±°°° ³
'ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
'³ Places a sprite on the current _DEST (normally screen) at the coordinates provided. ³ - The x and y values supplied by the programmer can be sent in as single precision to allow ³
'³ ³ for fine x and y increments. Internally the final x and y values needed for image placement ³
'³ SL_PUT_SPRITE 100, 100, mysprite% ³ are converted to integer values. ³
'³ ³ ³
'³ Input : x - x location (column) to place sprite. ³ ³
'³ y - y location (row) to place sprite. ³ ³
'³ handle - the sprite to place on the screen. ³ ³
'³ ³ ³
'³ Sets : ³ ³
'³ ³ ³
'³ ³ ³
'³ ³ ³
'³ ³ ³
'³ ³ ³
'³ Errors: All reported errors will be in the 300 - 399 range for this function. ³ ³
'³ ³ ³
'ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
'³ °°°±±±²²²ÛÛÛ KNOWN ISSUES ÛÛÛ²²²±±±°°° ³ °°°±±±²²²ÛÛÛ CREDITS ÛÛÛ²²²±±±°°° ³
'ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
'³ ³ ³
'³ ³ ³
'ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
'³ °°°±±±²²²ÛÛÛ THEORY OF OPERATION ÛÛÛ²²²±±±°°° ³
'ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
'³ ³
'³ ³
'³ ³
'³ ³
'³ ³
'ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
'³ °°°±±±²²²ÛÛÛ HISTORY ÛÛÛ²²²±±±°°° ³
'ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
'³ Date: 09/10/18 by Terry Ritchie ³
'³ : Initial writing of code. ³
'³ ³
'ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
' declare global variables
SHARED SL_sprite
() AS SL_SPRITE
' master working sprite array
' declare local variables
' perform error checks
IF NOT SL_VALID_SPRITE
(handle
) THEN ' is this a valid sprite? SL_ERROR "SL_PUT_SPRITE", 300, "" ' no, report error to programmer
'local variable setup
SL_sprite(handle).xreal = x ' (SINGLE) save requested x center location
SL_sprite(handle).yreal = y ' (SINGLE) save requested y center location
SL_sprite
(handle
).xint
= INT(x
) ' (INTEGER) save screen x center location SL_sprite
(handle
).yint
= INT(y
) ' (INTEGER) save screen y center location IF SL_sprite
(handle
).rotation
THEN ' is sprite rotated? sprite = SL_sprite(handle).rsprite ' yes, get rotated sprite image
sw = SL_sprite(handle).rspritewidth ' get rotated sprite width
sh = SL_sprite(handle).rspriteheight ' get rotated sprite height
ELSE ' sprite is not rotated sprite = SL_sprite(handle).sprite ' get standard sprite image
sw = SL_sprite(handle).spritewidth ' get standard sprite width
sh = SL_sprite(handle).spriteheight ' get standard sprite height
xa = SL_sprite(handle).xint - sw \ 2 ' calculate actual screen x location from center
ya = SL_sprite(handle).yint - sh \ 2 ' calculate actual screen y location from center
SL_sprite(handle).xactual = xa ' (INTEGER) save actual screen x location
SL_sprite(handle).yactual = ya ' (INTEGER) save actual screen y location
' place sprite on the current destination
SELECT CASE SL_sprite
(handle
).flip
' which flipping style is selected? CASE 0 ' (constant SL_NOFLIP) normal, no flipping _PUTIMAGE (xa
, ya
), sprite
' draw normal sprite CASE 1 ' (constant SL_HORIZONTAL) flip horizontally _PUTIMAGE (xa
+ sw
- 1, ya
)-(xa
, ya
+ sh
- 1), sprite
' draw horizontally flipped sprite CASE 2 ' (constant SL_VERTICAL) flip vertically _PUTIMAGE (xa
, ya
+ sh
- 1)-(xa
+ sw
- 1, ya
), sprite
' draw vertically flipped sprite CASE 3 ' (constant SL_FLIPBOTH) flip vertically and horizontally _PUTIMAGE (xa
+ sw
- 1, ya
+ sh
- 1)-(xa
, ya
), sprite
' draw horizontally and vertically flipped sprite
' ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
'ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
'³ °°°±±±²²²ÛÛÛ COMMAND DESCRIPTION AND USAGE ÛÛÛ²²²±±±°°° ³ °°°±±±²²²ÛÛÛ NOTES ÛÛÛ²²²±±±°°° ³
'ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
'³ Creates a pointer to a sprite contained in the SL_sprite database array. ³ - Two constants have been created for use with this function: ³
'³ ³ : SL_NOSAVE ( 0) do not save the background image behind sprite between calls. ³
'³ mysprite% = SL_NEW_SPRITE(mysheet%, 2, 3, SL_NOSAVE) ³ : SL_SAVE (-1) save the background image behind sprite between calls. ³
'³ ³ - The function will report an error on the following conditions: ³
'³ Input : sheet - the sprite sheet the sprite resides on. ³ : An invalid sprite sheet has been selected. ³
'³ column - the column in the sprite sheet the sprite resides in. ³ : An invalid row or column value within a sprite sheet has been requested. ³
'³ row - the row in the sprite sheet the sprite resides in. ³ : An invalid background image restoration method has been requested. ³
'³ restores - background saving behavior ³ ³
'³ : 0 - don't restore background between calls. ³ ³
'³ : -1 - restore the background between calls. ³ ³
'³ ³ ³
'³ Output: an integer value greater than zero (0) that acts as a handle pointing to the sheet and ³ ³
'³ location on the sheet where a sprite resides. ³ ³
'³ ³ ³
'³ Sets : SL_sprite(x).inuse = -1 (TRUE, this sprite index is in use) ³ ³
'³ SL_sprite(x).sheet = sheet (the sprite sheet where this sprite resides) ³ ³
'³ SL_sprite(x).column = column (column within sprite sheet where sprite resides) ³ ³
'³ SL_sprite(x).row = row (row within sprite sheet where sprite resides) ³ ³
'³ SL_sprite(x).restore = restores (background save behavior of sprite) ³ ³
'³ SL_sprite(x).spritewidth (sprite width copied from sprite sheet) ³ ³
'³ SL_sprite(x).spriteheight (sprite height copied from sprite sheet) ³ ³
'³ SL_sprite(x).collx1 (upper left collision box x copied from sheet) ³ ³
'³ SL_sprite(x).colly1 (upper left collision box y copied from sheet) ³ ³
'³ SL_sprite(x).collx2 (lower right collision box x copied from sheet) ³ ³
'³ SL_sprite(x).colly2 (lower right collision box y copied from sheet) ³ ³
'³ SL_sprite(x).sprite (hardware sprite image created from sheet image) ³ ³
'³ SL_sprite(x).image (software sprite image copied from sheet image) ³ ³
'³ SL_sprite(x).mask (software mask image copied from sheet image) ³ ³
'³ ³ ³
'³ all other SL_sprite(x).* subvariables reset to their initial value ³ ³
'³ ³ ³
'³ Errors: All reported errors will be in the 200 - 299 range for this function. ³ ³
'³ ³ ³
'ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
'³ °°°±±±²²²ÛÛÛ KNOWN ISSUES ÛÛÛ²²²±±±°°° ³ °°°±±±²²²ÛÛÛ CREDITS ÛÛÛ²²²±±±°°° ³
'ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
'³ None ³ None ³
'³ ³ ³
'ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
'³ °°°±±±²²²ÛÛÛ THEORY OF OPERATION ÛÛÛ²²²±±±°°° ³
'ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
'³ The sprite array database is scanned for a free index and once found that index number becomes the handle (pointer) the the sprite being created. The new index contains further pointers to ³
'³ where the requested sprite is located in the sprite sheet array database; the sheet number, the row, and the column the sprite resides in within the sheet. Information from the sprite sheet ³
'³ is then copied over (see Sets: above) from the sheet array to the sprite array. A hardware image of the sprite is then created from the software image contained in the sprite sheet. ³
'³ ³
'ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
'³ °°°±±±²²²ÛÛÛ HISTORY ÛÛÛ²²²±±±°°° ³
'ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
'³ Date: 09/10/18 by Terry Ritchie ³
'³ : Initial writing of code. ³
'³ ³
'ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
' declare global variables
SHARED SL_sheet
() AS SL_SHEET
' master sprite sheet array SHARED SL_sprite
() AS SL_SPRITE
' master working sprite array
' declare local variables
DIM handle
AS INTEGER ' handle (pointer) number of new sprite
' perform error checks
IF sheet
> UBOUND(SL_sheet
) OR SL_sheet
(sheet
, 0, 0).image
<> -1 THEN ' valid sprite sheet requested? SL_ERROR "SL_NEW_SPRITE", 200, "" ' no, report error to programmer
IF column
> UBOUND(SL_sheet
, 2) OR row
> UBOUND(SL_sheet
, 3) OR row
< 1 OR column
< 1 THEN ' valid row and column requested? SL_ERROR "SL_NEW_SPRITE", 201, "" ' no, report error to programmer
IF ABS(restores
) > 1 THEN ' valid background restoration behavior requested? SL_ERROR "SL_NEW_SPRITE", 202, "" ' no, report error to programmer
' local variable setup
handle = 0 ' initialize handle value
' increase sprite array's size if needed
DO ' look for next available handle handle = handle + 1 ' increment to next handle value
LOOP UNTIL (NOT SL_sprite
(handle
).inuse
) OR handle
= UBOUND(SL_sprite
) ' stop looking when valid handle found IF SL_sprite
(handle
).inuse
THEN ' is the last array element in use? handle = handle + 1 ' yes, increment to next handle value
REDIM _PRESERVE SL_sprite
(handle
) AS SL_SPRITE
' increase the size of the sprite array
' populate sprite array
SL_sprite(handle).inuse = -1 ' (TRUE) mark array index as in use
SL_sprite(handle).sheet = sheet ' point to sheet where sprite resides *
SL_sprite(handle).column = column ' point to column on sheet where sprite located * these still needed?
SL_sprite(handle).row = row ' point to row on sheet where sprite located *
SL_sprite
(handle
).
restore = restores
' (constants SL_SAVE & SL_NOSAVE) background restore behavior of sprite SL_sprite(handle).rsprite = 0 ' no rotated hardware image yet
SL_sprite(handle).rimage = 0 ' no rotated software image yet
SL_sprite(handle).rmask = 0 ' no rotated software mask image yet
SL_sprite(handle).background = 0 ' no background image saved yet
SL_sprite(handle).xreal = 0 ' reset x location of sprite (center x)
SL_sprite(handle).yreal = 0 ' reset y location of sprite (center y)
SL_sprite(handle).xint = 0 ' reset x location of sprite on screen INT(xreal) (center x)
SL_sprite(handle).yint = 0 ' reset y location of sprite on screen INT(yreal) (center y)
SL_sprite(handle).xactual = 0 ' reset x location of sprite on screen (upper left x)
SL_sprite(handle).yactual = 0 ' reset y location of sprite on screen (upper left y)
SL_sprite(handle).collx1 = SL_sheet(sheet, column, row).collx1 ' get sprite's collision box boundaries
SL_sprite(handle).colly1 = SL_sheet(sheet, column, row).colly1
SL_sprite(handle).collx2 = SL_sheet(sheet, column, row).collx2
SL_sprite(handle).colly2 = SL_sheet(sheet, column, row).colly2
SL_sprite(handle).spritewidth = SL_sheet(sheet, column, row).spritewidth ' get width of sprite
SL_sprite(handle).spriteheight = SL_sheet(sheet, column, row).spriteheight ' get height of sprite
SL_sprite
(handle
).sprite
= _COPYIMAGE(SL_sheet
(sheet
, column
, row
).image
, 33) ' create hardware sprite image SL_sprite
(handle
).image
= _COPYIMAGE(SL_sheet
(sheet
, column
, row
).image
, 32) ' copy software sprite image from sheet IF SL_sheet
(sheet
, column
, row
).transparency
THEN ' does this sprite use transparency? SL_sprite
(handle
).mask
= _COPYIMAGE(SL_sheet
(sheet
, column
, row
).mask
, 32) ' yes, copy software sprite mask image from sheet SL_sprite(handle).transparency = -1 ' (TRUE) remember this sprite has a transparency layer
SL_sprite(handle).mask = 0 ' no mask will be brought in
SL_sprite(handle).transparency = 0 ' (FALSE) remember this sprite has no transparency layer
SL_sprite(handle).flip = 0 ' no sprite flipping
SL_sprite(handle).rotation = 0 ' no sprite rotation angle
SL_NEW_SPRITE = handle
' ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
'ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
'³ °°°±±±²²²ÛÛÛ COMMAND DESCRIPTION AND USAGE ÛÛÛ²²²±±±°°° ³ °°°±±±²²²ÛÛÛ NOTES ÛÛÛ²²²±±±°°° ³
'ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
'³ Loads a sprite sheet's sprites into memory and stores them in the sprite sheet array. Three ³ - The software image mask will only be created if the sprite sheet contains a transparency ³
'³ sprite images are created for each sprite; a hardware image for displaying, a software image ³ layer (alpha channel) either built-in or user defined. ³
'³ for manipulating, and a software mask image for pixel collision detection. ³ - Three constants have been created for use with this function: ³
'³ ³ : SL_SHEETTRANSPARENCY (-1) to have the function use built-in sprite sheet's alpha layer. ³
'³ mysheet% = SL_NEW_SPRITE_SHEET("sprites.png", 64, 96, SL_SETTRANSPARENCY, _RGB32(255, 0, 255)) ³ : SL_SETTRANSPARENCY ( 0) to have the function use the programmer supplied alpha value. ³
'³ ³ : SL_NOTRANSPARENCY ( 1) to have the function ignore alpha channel completely. ³
'³ Input : filename - the name of the sprite sheet image file to load in. ³ - The function will report an error on the following conditions: ³
'³ spritewidth - the width of every sprite contained on the sprite sheet. ³ : A filename is supplied that does not exist. ³
'³ spriteheight - the height of every sprite contained on the sprite sheet. ³ : A sprite width or height that is less than one (1). ³
'³ transparency - the type of transparency to apply to the sprite sheet and sprites: ³ : An invalid transparency type value. Valid types are from negative one (-1) to one (1). ³
'³ : -1 - use the sprite sheet's built-in alpha channel (PNG files). ³ : The sprite sheet does not contain at least one row and column of sprites. ³
'³ : 0 - use the programmer assigned alpha channel value. ³ - The programmer supplied alpha channel value will be ignored if transparency is set to a ³
'³ : 1 - this sheet does not have any transparency included. ³ value of negative one (-1). ³
'³ transcolor - programmer assigned alpha channel value for the sprite sheet. ³ - When transparency is set to one (1) the programmer supplied transcolor is used to identify ³
'³ ³ the background color used in the sprite sheet. This is still needed to find the collision ³
'³ Output: An integer value greater than zero (0) that acts as a handle pointing to the sheet ³ box boundaries for collision detection. ³
'³ that contains the sprites. ³ ³
'³ ³ ³
'³ Sets : SL_sheet(x, 0, 0).image = -1 (TRUE, this sheet index is in use) ³ ³
'³ SL_sheet(x, 0, 0).spritewidth = columns (the number indexes in the 2nd dimension of ³ ³
'³ sheet array) ³ ³
'³ SL_sheet(x, 0, 0).spriteheight = rows (the number of indexes in the 3rd dimension ³ ³
'³ of sheet array) ³ ³
'³ SL_sheet(x, c, r).image software image copied from sprite sheet ³ ³
'³ SL_sheet(x, c, r).spritewidth width of sprite in pixels ³ ³
'³ SL_sheet(x, c, r).spriteheight height of sprite in pixels ³ ³
'³ SL_sheet(x, c, r).mask sprite mask (image black, background white) ³ ³
'³ SL_sheet(x, c, r).collx1 collision box upper left x ³ ³
'³ SL_sheet(x, c, r).colly1 collision box upper left y ³ ³
'³ SL_sheet(x, c, r).collx2 collision box lower right x ³ ³
'³ SL_sheet(x, c, r).colly2 collision box lower right y ³ ³
'³ * c = column r = row ³ ³
'³ ³ ³
'³ Errors: All reported errors will be in the 100 - 199 range for this function. ³ ³
'³ ³ ³
'ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
'³ °°°±±±²²²ÛÛÛ KNOWN ISSUES ÛÛÛ²²²±±±°°° ³ °°°±±±²²²ÛÛÛ CREDITS ÛÛÛ²²²±±±°°° ³
'ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
'³ Need to incorporate Steve's PNG transparency layer identifier instead of mine. ³ Portions of this subroutine have code based off of Galleon's RotoZoom subroutine in the QB64 ³
'³ ³ documentation at http://[abandoned, outdated and now likely malicious qb64 dot net website - don’t go there]/wiki/index.php?title=MAPTRIANGLE (link no longer works) ³
'³ ³ ³
'ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
'³ °°°±±±²²²ÛÛÛ THEORY OF OPERATION ÛÛÛ²²²±±±°°° ³
'ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
'³ Once the sprite sheet is loaded it is scanned for an alpha channel if the programmer requests to use the sheet's transparency layer. The width and height of the sheet are retrieved and then ³
'³ divided by the sprite dimensions provided by the programmer to determine how many columns and rows of sprites exist. A three dimensional sheet array is created where the first dimension is ³
'³ the sheet number (handle/pointer), the second and thirs dimensions are then related to the sprite column and row locations on the sheet. Each sprite is copied from the sprite sheet into the ³
'³ sprite sheet array. Each sprite is scanned to determine the absolute image size within the sprite (background/transparency areas are ignored) to determine the smallest possible collision box ³
'³ needed for collision detection. Finally, the sprite is scanned again to create an image mask for pixel perfect detection. ³
'³ ³
'ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
'³ °°°±±±²²²ÛÛÛ HISTORY ÛÛÛ²²²±±±°°° ³
'ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
'³ Date: 09/09/18 by Terry Ritchie ³
'³ : Initial writing of code. ³
'³ ³
'ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
' declare global variables
SHARED SL_sheet
() AS SL_SHEET
' master sprite sheet array SHARED SL_rotate
() AS SL_ROTATE
' precalculated rotation table
' declare local variables
DIM handle
AS INTEGER ' handle (pointer) number of new sprite sheet DIM x
AS INTEGER ' generic counter to cycle through sheet sprite columns DIM y
AS INTEGER ' generic counter to cycle through sheet sprite rows DIM x1
AS INTEGER ' generic counter to cycle though sprite for collision boundaries and mask creation DIM y1
AS INTEGER ' generic ocunter to cycle though sprite for collision boundaries and mask creation DIM osource
AS LONG ' original source image before this function was called DIM odest
AS LONG ' original destination image before this function was called DIM sheetheight
AS INTEGER ' height of sprite sheet in pixels DIM rows
AS INTEGER ' number of sprite rows contained on sheet DIM columns
AS INTEGER ' number of sprite columns contained on sheet DIM tempsprite
AS LONG ' temporary sprite for _CLEARCOLOR detection
DIM px
(3) AS SINGLE ' polar x coordinates of maptriangle DIM py
(3) AS SINGLE ' polar y coordinates of maptriangle
' perform error checks
SL_ERROR "SL_NEW_SPRITE_SHEET", 100, filename ' no, report error to programmer
IF ABS(transparency
) > 1 THEN ' valid transparency setting? SL_ERROR "SL_NEW_SPRITE_SHEET", 101, "" ' no, report error to programmer
IF spritewidth
< 1 OR spriteheight
< 1 THEN ' valid sprite width/height supplied? SL_ERROR "SL_NEW_SPRITE_SHEET", 102, "" ' no, report error to programmer
SL_ERROR
"SL_NEW_SPRITE_SHEET", 103, UCASE$(RIGHT$(filename
, 4)) ' yes, report error to programmer
' local variable setup
sheetimage
= _LOADIMAGE(filename
, 32) ' load sprite sheet file sheetwidth
= _WIDTH(sheetimage
) ' get width of sheet sheetheight
= _HEIGHT(sheetimage
) ' get height of sheet columns = sheetwidth \ spritewidth ' get number of whole columns of sprites
rows = sheetheight \ spriteheight ' get number of whole rows of sprites
IF columns
< 1 OR rows
< 1 THEN ' at least one sprite column and row on sheet? SL_ERROR "SL_NEW_SPRITE_SHEET", 104, "" ' no, report error to programmer
osource
= _SOURCE ' remember current source image odest
= _DEST ' remember current destination image handle = 0 ' initialize handle value
clearcolor = transcolor ' get background/transparent color passed in
' increase sheet array's 1st dimension if needed to create a new sprite sheet
DO ' look for the next available handle handle = handle + 1 ' increment the handle value
LOOP UNTIL (NOT SL_sheet
(handle
, 0, 0).image
) OR handle
= UBOUND(SL_sheet
) ' stop looking when valid handle value found IF SL_sheet
(handle
, 0, 0).image
= -1 THEN ' is the last array element in use? handle = handle + 1 ' yes, increment the handle value
' increase sheet array's 2nd and 3rd dimensions if needed to match number of rows and columns
IF columns
> UBOUND(SL_sheet
, 2) THEN ' more columns in this sheet than others? REDIM _PRESERVE SL_sheet
(handle
, columns
, UBOUND(SL_sheet
, 3)) AS SL_SHEET
' yes, increase the array's 2nd dimension to match IF rows
> UBOUND(SL_sheet
, 3) THEN ' more rows in this sheet than others? REDIM _PRESERVE SL_sheet
(handle
, UBOUND(SL_sheet
, 2), rows
) AS SL_SHEET
' yes, increase the array's 3rd dimension to match
' the variables in SL_sheet(x, 0, 0) will serve a dual purpose
' SL_sheet(x, 0, 0).image will contain either -1 (true) or 0 (false) to indicate the first dimension of the array is in use.
' SL_sheet(x, 0, 0).spritewidth will contain the number of columns contained in the sheet (the array's 2nd dimension)
' SL_sheet(x, 0, 0).spriteheight will contain the number of rows contained in the sheet (the array's 3rd dimension)
SL_sheet(handle, 0, 0).image = -1 ' (TRUE) mark as in use
SL_sheet(handle, 0, 0).spritewidth = columns ' remember number of columns in sheet
SL_sheet(handle, 0, 0).spriteheight = rows ' remember number of rows in sheet
' identify transparency of sprite sheet if requested
IF transparency
= -1 THEN ' (constant SL_SHEETTRANSPARENCY) sheet have alpha channel? x = 0 ' yes, start at upper left x of sheet
y = 0 ' start at upper left y of sheet
alpha = 255 ' assume no alpha channel
_SOURCE sheetimage
' set sprite sheet image as source image DO ' start looping through the sheet's pixels pixel
= POINT(x
, y
) ' get the pixel's color attributes alpha
= _ALPHA32(pixel
) ' get the alpha level (0 - 255) IF alpha
= 0 THEN EXIT DO ' if it is transparent then leave the loop x = x + 1 ' move right one pixel
IF x
> sheetwidth
THEN ' have we gone off the sheet? x = 0 ' yes, reset back to the left beginning
y = y + 1 ' move down one pixel
LOOP UNTIL y
> sheetheight
' don't stop until the entire sheet has been checked IF alpha
= 0 THEN ' did we find a transparent pixel? tempsprite
= _NEWIMAGE(1, 1, 32) ' yes, create a temporary image * why did I have to do _CLEARCOLOR pixel
, tempsprite
' set pixel found as transparent * this hack to get clearcolor
= _CLEARCOLOR(tempsprite
) ' get the transparent color from image * clearcolor to come out _FREEIMAGE tempsprite
' temporary image no longer needed * to the right value? ELSE ' no transparency found within sheet transparency = 1 ' set sheet to having no alpha channel
ELSEIF transparency
= 0 THEN ' (constant SL_SETTRANSPARENCY) manually set alpha channel? _CLEARCOLOR clearcolor
, sheetimage
' yes, set color as transparent clearcolor
= _CLEARCOLOR(sheetimage
) ' get the transparent color ************* again, why this hack?
' load sprites from sheet and place into sprite array
FOR x
= 1 TO columns
' cycle through the sheet's columns FOR y
= 1 TO rows
' cycle through the sheet's rows SL_sheet
(handle
, x
, y
).image
= _NEWIMAGE(spritewidth
, spriteheight
, 32) ' create software sprite image IF transparency
< 1 THEN ' should a mask be created? SL_sheet
(handle
, x
, y
).mask
= _NEWIMAGE(spritewidth
, spriteheight
, 32) ' yes, create software sprite mask image _DEST SL_sheet
(handle
, x
, y
).mask
' write to the mask image SL_sheet(handle, x, y).transparency = 0 ' (FALSE) set sprite as having no transparency
_PUTIMAGE , sheetimage
, SL_sheet
(handle
, x
, y
).image
,_
((x - 1) * spritewidth, (y - 1) * spriteheight)-_
((x - 1) * spritewidth + spritewidth - 1, (y - 1) * spriteheight + spriteheight - 1) ' copy sprite from sheet and place in sprite image
' precalculate collision boundaries and update sprite mask if needed
_SOURCE SL_sheet
(handle
, x
, y
).image
' work from the software sprite image top = spriteheight ' set initial collision boundary markers
left = spritewidth
bottom = 0
right = 0
FOR x1
= 0 TO spritewidth
- 1 ' cycle through the width of sprite FOR y1
= 0 TO spriteheight
- 1 ' cycle through the height of sprite IF POINT(x1
, y1
) <> clearcolor
THEN ' is this pixel a transparent/background color? IF x1
< left
THEN left
= x1
' no, save position if left-most pixel IF y1
< top
THEN top
= y1
' save position if top-most pixel IF x1
> right
THEN right
= x1
' save position if right-most pixel IF y1
> bottom
THEN bottom
= y1
' save position if bbottom-most pixel IF transparency
< 1 THEN ' update software sprite mask? IF POINT(x1
, y1
) = clearcolor
THEN ' yes, is this pixel a transparent/background color? PSET (x1
, y1
), _RGB32(255, 255, 255) ' yes, set as white on the mask image SL_sheet(handle, x, y).collx1 = left ' collision box top left x
SL_sheet(handle, x, y).colly1 = top ' collision box top left y
SL_sheet(handle, x, y).collx2 = right ' collision box bottom right x
SL_sheet(handle, x, y).colly2 = bottom ' collision box bottom right y
SL_sheet(handle, x, y).spritewidth = spritewidth ' remember sprite width
SL_sheet(handle, x, y).spriteheight = spriteheight ' remember sprite height
_FREEIMAGE sheetimage
' sprite sheet image no longer needed
' create precalculated rotation table for the sprite sheet (0 to 359 degrees)
px(0) = -spritewidth / 2 ' upper left x polar coordinate of sprite
py(0) = -spriteheight / 2 ' upper left y polar coordinate of sprite
px(1) = px(0) ' lower left x polar coordinate of sprite
py(1) = spriteheight / 2 ' lower left y polar coordinate of sprite
px(2) = spritewidth / 2 ' lower right x polar coordinate of sprite
py(2) = py(1) ' lower right y polar coordinate of sprite
px(3) = px(2) ' upper right x polar coordinate of sprite
py(3) = py(0) ' upper right y polar coordinate of sprite
sinr
= SIN(-x
/ 57.2957795131) ' calculate the sin of rotation cosr
= COS(-x
/ 57.2957795131) ' calculate the cosine of rotation bx1 = 0 ' upper left x boundary of sprite
by1 = 0 ' upper left y boundary of sprite
bx2 = 0 ' lower right x boundary of sprite
by2 = 0 ' lower right y boundary of sprite
FOR y
= 0 TO 3 ' cycle through all four polar coordinates x2 = (px(y) * cosr + sinr * py(y)) ' compute new polar coordinate location
y2 = (py(y) * cosr - px(y) * sinr) ' compute new polar coordinate location
px(y) = x2 ' save the new polar coordinate
py(y) = y2 ' save the new polar coordinate
IF px
(y
) < bx1
THEN bx1
= px
(y
) ' save lowest x value seen \ NOTE: use for IF px
(y
) > bx2
THEN bx2
= px
(y
) ' save highest x value seen \ background image <--------------------- LOOK IF py
(y
) < by1
THEN by1
= py
(y
) ' save lowest y value seen / rectangle coordinates IF py
(y
) > by2
THEN by2
= py
(y
) ' save highest y value seen / SL_rotate(handle, x).rwidth = bx2 - bx1 + 1 ' calculate width of rotated sprite
SL_rotate(handle, x).rheight = by2 - by1 + 1 ' calculate height of rotated sprite
SL_rotate(handle, x).px0 = px(0) + ((bx2 - bx1 + 1) / 2) ' calculate triangular coordinates
SL_rotate(handle, x).px1 = px(1) + ((bx2 - bx1 + 1) / 2)
SL_rotate(handle, x).px2 = px(2) + ((bx2 - bx1 + 1) / 2)
SL_rotate(handle, x).px3 = px(3) + ((bx2 - bx1 + 1) / 2)
SL_rotate(handle, x).py0 = py(0) + ((by2 - by1 + 1) / 2)
SL_rotate(handle, x).py1 = py(1) + ((by2 - by1 + 1) / 2)
SL_rotate(handle, x).py2 = py(2) + ((by2 - by1 + 1) / 2)
SL_rotate(handle, x).py3 = py(3) + ((by2 - by1 + 1) / 2)
_SOURCE osource
' return source to current _DEST odest
' return destination to current SL_NEW_SPRITE_SHEET = handle ' return the handle number pointing to this sheet
' ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
'ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
'³ °°°±±±²²²ÛÛÛ COMMAND DESCRIPTION AND USAGE ÛÛÛ²²²±±±°°° ³ °°°±±±²²²ÛÛÛ NOTES ÛÛÛ²²²±±±°°° ³
'ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
'³ Reports a Sprite Library error to the programmer. Used internally only. ³ - A copy of this library has been provided that has all of the error checks removed. Once ³
'³ ³ you are sure no errors exist you would then include that library for your final ³
'³ Input : routine - the function/subroutine the error occurred in ³ compilation. The error checking routines do take some processing away from your code so ³
'³ ³ performance will improve by removing them. ³
'³ errno - the error number associated with the error ³ ³
'³ 100 - sprite does not exist ³ ³
'³ 101 - sprite is not in use ³ ³
'³ 102 - sprite can't be hidden ³ ³
'³ 103 - invalid zoom value ³ ³
'³ 104 - invalid rotation angle ³ ³
'³ 105 - invalid flipping behavior ³ ³
'³ 106 - sheet does not exist ³ ³
'³ 107 - sheet is not in use ³ ³
'³ 108 - invalid transparency setting ³ ³
'³ 109 - invalid sprite width/height ³ ³
'³ ³ ³
'³ info - any information that need to be conveyed with the error ³ ³
'³ such as a file name ³ ³
'³ ³ ³
'ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
'³ °°°±±±²²²ÛÛÛ KNOWN ISSUES ÛÛÛ²²²±±±°°° ³ °°°±±±²²²ÛÛÛ CREDITS ÛÛÛ²²²±±±°°° ³
'ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
'³ none ³ This routine was created in response to a request from QB64 member pitt ³
'³ ³ http://www.[abandoned, outdated and now likely malicious qb64 dot net website - don’t go there]/forum/index.php?topic=7281.0 (link no longer works) ³
'³ ³ ³
'ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
'³ °°°±±±²²²ÛÛÛ THEORY OF OPERATION ÛÛÛ²²²±±±°°° ³
'ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
'³ A pure text screen is shown, the font reset to default, and _AUTODISPLAY enabled. This forces the code out of any graphics screen it may currently be in. The error is then displayed to the ³
'³ programmer based on the values passed in. The program is then forced to terminate. ³
'³ ³
'ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
'³ °°°±±±²²²ÛÛÛ HISTORY ÛÛÛ²²²±±±°°° ³
'ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
'³ Date: 09/09/18 by Terry Ritchie ³
'³ : Initial writing of code. ³
'³ ³
'ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
SCREEN 0, 0, 0, 0 ' go to a pure text screen _FONT 16 ' set the standard screen 0 font PRINT " **************************************" ' print error header PRINT " ** Sprite Library Error Encountered **" PRINT " **************************************" PRINT " has reported error";
SELECT CASE errno
' which error number is being reported? PRINT "- ";
CHR$(34); info;
CHR$(34);
" sprite sheet does not exist" PRINT "- check path or spelling" PRINT "- invalid transparency setting supplied - valid settings are" PRINT "- : -1 (constant SL_SHEETTRANSPARENCY)" PRINT "- : 0 (constant SL_SETTRANSPARENCY)" PRINT "- : 1 (constant SL_NOTRANSPARENCY)" PRINT "- sprite width and height must be greater than zero" PRINT "- selecting to use a sheet's transparency only works with .PNG files" PRINT "- the function was passed a "; info;
" file." PRINT "- there must be at least one column and one row of sprites on sheet" PRINT "- the specified sprite sheet is not in use or does not exist" PRINT "- invalid row or column selected for specified sprite sheet" PRINT "- background restore behavior for a sprite can only be 0 (FALSE) or -1 (TRUE)" PRINT "- the requested sprite does not exist" PRINT " See sprite library doumentation for further explanation."
' ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
'ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
'³ °°°±±±²²²ÛÛÛ COMMAND DESCRIPTION AND USAGE ÛÛÛ²²²±±±°°° ³ °°°±±±²²²ÛÛÛ NOTES ÛÛÛ²²²±±±°°° ³
'ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
'³ Reports on the validity of a sprite handle (pointer). ³ ³
'³ ³ ³
'³ valid% = SL_VALID_SPRITE(mysprite%) ³ ³
'³ ³ ³
'³ Input : handle - the handle (pointer) of the sprite being examined. ³ ³
'³ ³ ³
'³ Output: an integer value of zero (0) (FALSE) or negative 1 (-1) (TRUE) ³ ³
'³ ³ ³
'ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
'³ °°°±±±²²²ÛÛÛ KNOWN ISSUES ÛÛÛ²²²±±±°°° ³ °°°±±±²²²ÛÛÛ CREDITS ÛÛÛ²²²±±±°°° ³
'ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
'³ None ³ None ³
'³ ³ ³
'ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
'³ °°°±±±²²²ÛÛÛ THEORY OF OPERATION ÛÛÛ²²²±±±°°° ³
'ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
'³ The sprite database is examined at the index the handle points to. If .inuse is -1 (TRUE) then the sprite handle is valid. ³
'³ ³
'ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
'³ °°°±±±²²²ÛÛÛ HISTORY ÛÛÛ²²²±±±°°° ³
'ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
'³ Date: 09/11/18 by Terry Ritchie ³
'³ : Initial writing of code. ³
'³ ³
'ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
' declare global variables
SHARED SL_sprite
() AS SL_SPRITE
' master working sprite array
IF handle
> UBOUND(SL_SPRITE
) OR (NOT SL_sprite
(handle
).inuse
) THEN ' is this a valid sprite handle? SL_VALID_SPRITE = 0 ' (FALSE) no, return 0
SL_VALID_SPRITE = -1 ' (TRUE) return -1
' ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
'ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
'³ °°°±±±²²²ÛÛÛ COMMAND DESCRIPTION AND USAGE ÛÛÛ²²²±±±°°° ³ °°°±±±²²²ÛÛÛ NOTES ÛÛÛ²²²±±±°°° ³
'ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
'³ ³ ³
'³ ³ ³
'ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
'³ °°°±±±²²²ÛÛÛ KNOWN ISSUES ÛÛÛ²²²±±±°°° ³ °°°±±±²²²ÛÛÛ CREDITS ÛÛÛ²²²±±±°°° ³
'ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
'³ ³ ³
'³ ³ ³
'ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
'³ °°°±±±²²²ÛÛÛ THEORY OF OPERATION ÛÛÛ²²²±±±°°° ³
'ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
'³ ³
'³ ³
'ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
'³ °°°±±±²²²ÛÛÛ HISTORY ÛÛÛ²²²±±±°°° ³
'ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
'³ ³
'³ ³
'ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ