• Hey Guest! Ever feel like entering a Game Jam, but the time limit is always too much pressure? We get it... You lead a hectic life and dedicating 3 whole days to make a game just doesn't work for you! So, why not enter the GMC SLOW JAM? Take your time! Kick back and make your game over 4 months! Interested? Then just click here!

2D Tile Collision help

Q

Queble

Guest
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