01-21-2023, 08:37 PM
And here's a completely different way to check for pixel perfect collision with our two stars:
This basically forms an array of the coordinates which are needed to create the outline for our red star, and then it compares to see if they're still red or not. Simple enough, right?
And, would you guys believe that this little red star has 383 points in its outline?! Even so, without trying to do anything fancy to optimize things (this is all software images and POINT calculations, with no hardware or mem at use at all), this still runs at over 500 FPS on my PC and has no issues with the collision detection at all, that I can find.
Code: (Select All)
TYPE PointType
AS INTEGER x, y
END TYPE
SCREEN _NEWIMAGE(1280, 720, 32)
DIM AS _UNSIGNED LONG target
DIM SHARED Backdrop AS LONG: Backdrop = _COPYIMAGE(0)
REDIM CA(0) AS PointType
blueStar = _LOADIMAGE("Z:\starBlue.png", 32)
redStar = _LOADIMAGE("z:\starRed.png", 32)
CleanImage blueStar
CleanImage redStar
MakeCollisionArray redStar, CA()
t# = TIMER + 1
DO
CLS , 0
IF TIMER > t# THEN
out$ = STR$(count)
count = 0
t# = TIMER + 1
END IF
count = count + 1
LOCATE 2, 1: PRINT out$; "FPS"
IF _KEYDOWN(18432) THEN yPos = yPos - 1
IF _KEYDOWN(20480) THEN yPos = yPos + 1
IF _KEYDOWN(19200) THEN xPos = xPos - 1
IF _KEYDOWN(19712) THEN xPos = xPos + 1
IF _KEYDOWN(32) THEN xPos = 0: yPos = 0 'reset
IF _KEYDOWN(27) THEN SYSTEM
_PUTIMAGE (xPos, yPos), redStar
_PUTIMAGE (100, 100), blueStar
CheckCollision xPos, yPos, CA()
_DISPLAY
LOOP
SUB CheckCollision (xOffset AS INTEGER, yOffset AS INTEGER, CA() AS PointType)
FOR i = 1 TO UBOUND(CA)
x% = xOffset + CA(i).x
y% = yOffset + CA(i).y
IF POINT(x%, y%) <> &HFFFF0000&& THEN
LOCATE 1, 1: PRINT "Collision at:"; x%, y%
EXIT SUB
END IF
NEXT
END SUB
SUB MakeCollisionArray (image AS LONG, CA() AS PointType) 'CA = Collision Array
REDIM CA(_WIDTH(image) * _HEIGHT(image)) AS PointType
DIM AS LONG D, S: D = _DEST: S = _SOURCE
DIM AS LONG count: count = -1
_SOURCE image
FOR y = 0 TO _HEIGHT - 1
FOR x = 0 TO _WIDTH - 1
IF POINT(x, y) = &HFFFF0000&& THEN
IF y > 0 THEN
IF POINT(x, y - 1) = 0 THEN
count = count + 1
CA(count).x = x
CA(count).y = y
_CONTINUE
END IF
END IF
IF y < _HEIGHT - 1 THEN
IF POINT(x, y + 1) = 0 THEN
count = count + 1
CA(count).x = x
CA(count).y = y
_CONTINUE
END IF
END IF
IF x > 0 THEN
IF POINT(x - 1, y) = 0 THEN
count = count + 1
CA(count).x = x
CA(count).y = y
_CONTINUE
END IF
END IF
IF x < _WIDTH - 1 THEN
IF POINT(x + 1, y) = 0 THEN
count = count + 1
CA(count).x = x
CA(count).y = y
_CONTINUE
END IF
END IF
END IF
NEXT
NEXT
REDIM _PRESERVE CA(count) AS PointType
_DEST D: _SOURCE S
END SUB
SUB CleanImage (image AS LONG) 'make backdrop image
DIM m AS _MEM: m = _MEMIMAGE(image)
DIM AS _OFFSET o, l
DIM AS _UNSIGNED LONG p
o = m.OFFSET: l = m.OFFSET + m.SIZE
$CHECKING:OFF
DO UNTIL o >= l
_MEMGET m, o, p
SELECT CASE p
CASE &HFFFF0000, &HFF0000FF
CASE ELSE: _MEMPUT m, o, &H00000000 AS _UNSIGNED LONG
END SELECT
o = o + 4
LOOP
$CHECKING:ON
END SUB
This basically forms an array of the coordinates which are needed to create the outline for our red star, and then it compares to see if they're still red or not. Simple enough, right?
And, would you guys believe that this little red star has 383 points in its outline?! Even so, without trying to do anything fancy to optimize things (this is all software images and POINT calculations, with no hardware or mem at use at all), this still runs at over 500 FPS on my PC and has no issues with the collision detection at all, that I can find.