Pixel Perfect Collision

Previous topic - Next topic

kamakazieturtle

A little example I threw together last night. Been using it for a while thought others may like it.

Code (glbasic) Select
SETSCREEN 640,480,0
LIMITFPS 60

GLOBAL Walls = 1
LOADSPRITE "Walls.png",Walls

TYPE BallType
Image
Speed
X
Y
US
RS
DS
LS
ENDTYPE

GLOBAL Ball AS BallType

Ball.Image = 2
LOADSPRITE "Ball.png",Ball.Image
Ball.Speed = 2
Ball.X = 164
Ball.Y = 124
Ball.US = 0
Ball.RS = 0
Ball.DS = 0
Ball.LS = 0


Main:
BLACKSCREEN

Movement()
Collision()
Draw()

SHOWSCREEN
GOTO Main


FUNCTION Movement:
IF KEY(200) AND Ball.US = 1
Ball.Y = Ball.Y - Ball.Speed
ENDIF

IF KEY(205) AND Ball.RS = 1
Ball.X = Ball.X + Ball.Speed
ENDIF

IF KEY(208) AND Ball.DS = 1
Ball.Y = Ball.Y + Ball.Speed
ENDIF

IF KEY(203) AND Ball.LS = 1
Ball.X = Ball.X - Ball.Speed
ENDIF
ENDFUNCTION


FUNCTION Collision:
FOR A = 0 TO Ball.Speed
IF SPRCOLL(Ball.Image,Ball.X,Ball.Y - Ball.Speed,Walls,0,0)
Ball.US = 0
Ball.Y = Ball.Y - (A - 1)
ELSE
Ball.US = 1
ENDIF

IF SPRCOLL(Ball.Image,Ball.X + Ball.Speed,Ball.Y,Walls,0,0)
Ball.RS = 0
Ball.X = Ball.X + (A - 1)
ELSE
Ball.RS = 1
ENDIF

IF SPRCOLL(Ball.Image,Ball.X,Ball.Y + Ball.Speed,Walls,0,0)
Ball.DS = 0
Ball.Y = Ball.Y + (A - 1)
ELSE
Ball.DS = 1
ENDIF

IF SPRCOLL(Ball.Image,Ball.X - Ball.Speed,Ball.Y,Walls,0,0)
Ball.LS = 0
Ball.X = Ball.X - (A - 1)
ELSE
Ball.LS = 1
ENDIF
NEXT
ENDFUNCTION


FUNCTION Draw:
DRAWSPRITE Walls,0,0
DRAWSPRITE Ball.Image,Ball.X,Ball.Y
ENDFUNCTION





D2O

I7 2600K; 8 GB RAM ; Win10 Pro x64 | NVidia GTX 750 TI 2048MB ; Realtec OnBoard Sound;
Lenovo ThinkPad T400: XP Pro
GLB Premium-immer Aktuell

kamakazieturtle

So sorry the collision function should look like this.

Code (glbasic) Select
FUNCTION Collision:
FOR A = 0 TO Ball.Speed
IF SPRCOLL(Ball.Image,Ball.X,Ball.Y - (A + 1),WallCollision,0,0)
Ball.US = 0
Ball.Y = Ball.Y - (A - 1)
ELSE
Ball.US = 1
ENDIF

IF SPRCOLL(Ball.Image,Ball.X + (A + 1),Ball.Y,WallCollision,0,0)
Ball.RS = 0
Ball.X = Ball.X + (A - 1)
ELSE
Ball.RS = 1
ENDIF

IF SPRCOLL(Ball.Image,Ball.X,Ball.Y + (A + 1),WallCollision,0,0)
Ball.DS = 0
Ball.Y = Ball.Y + (A - 1)
ELSE
Ball.DS = 1
ENDIF

IF SPRCOLL(Ball.Image,Ball.X - (A + 1),Ball.Y,WallCollision,0,0)
Ball.LS = 0
Ball.X = Ball.X - (A - 1)
ELSE
Ball.LS = 1
ENDIF
NEXT
ENDFUNCTION


Edit: I also found a bug using diagonal movement, I'll work on this tonight and see if I can't get a fix soon.