AABB vs TileMap collision response

Started by
-1 comments, last by lukadev0 10 years, 11 months ago

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?

This topic is closed to new replies.

Advertisement