• Hey! Guest! The 39th GMC Jam will take place between November 26th, 12:00 UTC and November 30th, 12:00 UTC. Why not join in! Click here to find out more!

2D Tile Collision help

Queble

Member
So I'm making a game where the player needs to collide with walls and stuff, right?
I watched every tutorial online, but there are none that show what i want (a player that can collide with tiles using his bounding box)

So I came up with this code, and the X dimension collisions work most of the time, but it is completely random and idk why it doesn't work :(
if anyone can spot the reason, or tell me how i can detect tiles with the bounding box and move accordingly using my xSpeed and ySpeed, that'd be much appreciated :)
GML:
//xSpeed and ySpeed is the velocity in each direction that the player is moving


//Horizontal Tiles
if (xSpeed < 0){
    if (tilemap_get_at_pixel(collisionmap, bbox_left + xSpeed, bbox_top)) or (tilemap_get_at_pixel(collisionmap, bbox_left + xSpeed, bbox_bottom)){
    x += bbox_left mod TILE_SIZE;
    if (sign(xSpeed) == 1) x += TILE_SIZE - 1;
    xSpeed = 0;
    }
}
if (xSpeed > 0){
    if (tilemap_get_at_pixel(collisionmap, bbox_right + xSpeed, bbox_top)) or (tilemap_get_at_pixel(collisionmap, bbox_right + xSpeed, bbox_bottom)){
    x -= bbox_right mod TILE_SIZE;
    if (sign(xSpeed) == 1) x += TILE_SIZE - 1;
    xSpeed = 0;
    }
}

//Horizontal Move commit
x += xSpeed;

//Vertical Tiles
if (ySpeed < 0){
    if (tilemap_get_at_pixel(collisionmap, bbox_right + ySpeed, bbox_top)) or (tilemap_get_at_pixel(collisionmap, bbox_left + ySpeed, bbox_top)){
    y += bbox_top mod TILE_SIZE;
    if (sign(ySpeed) == 1) y += TILE_SIZE - 1;
    ySpeed = 0;
    }
}
if (ySpeed > 0){
    if (tilemap_get_at_pixel(collisionmap, bbox_right + ySpeed, bbox_bottom)) or (tilemap_get_at_pixel(collisionmap, bbox_left + ySpeed, bbox_bottom)){
    y -= bbox_bottom mod TILE_SIZE;
    if (sign(ySpeed) == 1) y += TILE_SIZE - 1;
    ySpeed = 0;
    }
}

//Vertical Move commit
y += ySpeed;
EDIT: what this code is doing is: detecting if the bounding box (bbox) will collide with the tile layer (collisionmap) in the next frame of the game.
if so, the player will move into the current most adjacent tile ( snap to a 32x32 grid) and stop it's move speed.


Thanks!

-Queble
 

TheouAegis

Member
but there are none that show what i want (a player that can collide with tiles using his bounding box)
....What? Shaun Spalding has TWO videos about that.

if (xSpeed < 0){
if (tilemap_get_at_pixel(collisionmap, bbox_left + xSpeed, bbox_top)) or (tilemap_get_at_pixel(collisionmap, bbox_left + xSpeed, bbox_bottom)){
x += bbox_left mod TILE_SIZE;
if (sign(xSpeed) == 1)
x += TILE_SIZE - 1;
xSpeed = 0;
}
}
Reread that block.

And this one.
if (ySpeed < 0){
if (tilemap_get_at_pixel(collisionmap, bbox_right + ySpeed, bbox_top)) or (tilemap_get_at_pixel(collisionmap, bbox_left + ySpeed, bbox_top)){
y += bbox_top mod TILE_SIZE;
if (sign(ySpeed) == 1) y += TILE_SIZE - 1;
ySpeed = 0;
}
}
 
Last edited:
Top