Hi everyone!
I'm making a 2d tilemap game..and I have problems with aabb vs tilemap collision response..here's how I do it:
void handle_player_world_collision(Player* player,TileMap* map)
{
int topleft_xtile=map->xworld_to_map(player->pos.x);
int topleft_ytile=map->yworld_to_map(player->pos.y);
int bottright_xtile=map->xworld_to_map(player->pos.x+player->aabb.w);
int bottright_ytile=map->yworld_to_map(player->pos.y+player->aabb.h);
//we loop through all the tiles that the player's aabb touch
for(int i=topleft_xtile;i<bottright_xtile;i++)
{
for(int j=topleft_ytile;j<bottright_ytile;j++)
{
//here we test for map coordinates (i,j) validity...
//...
///////
if(map->getTile(i,j)->is(Tile::SOLID))
{
if(player->vel.x<=0 && player->vel.y<=0)
{//we are trying to move left_top;calculate the overlap according to each axis
//and resolve collision where the overlap is minimal
float xoverlap=(i+1)*map->tile_width-player->pos.x;
float yoverlap=(j+1)*map->tile_height-player->pos.y;
if(xoverlap<yoverlap)
{
player->pos.x=(i+1)*map->tile_width;
player->vel.x=0;
}
else
{
player->pos.y=(j+1)*map->tile_height;
player->vel.y=0;
}
}
//here you the same as above
//detect what's the movement direction that led o this
//collision.
//resolve collision by changing the player position to
//be adjacent to the tile in the direction where the
//overlap was minimal!
}
}
}
}
I have problems in detecting the collision when I move diagonally;and sometimes even horizontally!
Am I doing it right?of course not...
I want also to detect the side of the collision of two AABB..
Can Anyone show me how to do it?