Issue with lone tiles or corner tiles in grid based movement

3 posts

Flag Post

Like the topic says, the following code is based on top down grid style collision detection and movement… So I have this ball which is moving around tiles… let me just show you all the code first then I will mention the problem:-


if (isReady && isMovin)
{
	//trace("speed is " + speed);
	speedX = Math.cos(angle) * speed * flagX;
	speedY = Math.sin(angle) * speed * flagY;
		
	x_pos = this.x + speedX;
	y_pos = this.y + speedY;
		
	left = Math.floor((x_pos - 9) / tile_size);
	bottom = Math.floor((y_pos + 9) / tile_size);
	top = Math.floor((y_pos - 9) / tile_size);
	right = Math.floor((x_pos + 9) / tile_size);
			
	top_left = level[top][left];
	bottom_left = level[bottom][left];
	top_right = level[top][right];
	bottom_right = level[bottom][right]; 
				
	//no wall encountered carry on		
	if (top_left != 1 && bottom_left != 1 && top_right != 1 && bottom_right != 1)     
	{
		this.x += speedX;
		this.y += speedY;
	}
	else             //code for checking collision with walls
	{
		if (top_left == 1 && bottom_left == 1 && speedX < 0)
		{
			this.x = (left + 1) * tile_size + 10;
			//this.y += speedY;
			speed -= 0.2;
			flagX = -flagX;
		}
		else if (top_right == 1 && bottom_right == 1 && speedX  > 0)
		{
			this.x = (right - 1) * tile_size + 8;
			//this.y += speedY;
			speed -= 0.2;
			flagX = -flagX;
		}
		else
		{
			this.x += speedX;
		}
		if (top_right == 1 && top_left == 1 && speedY < 0)
		{
			this.y = (top + 1) * tile_size + 9;
			//this.x += speedX;
			speed -= 0.2;
			flagY = -flagY;
		}
		else if (bottom_left == 1 && bottom_right == 1 && speedY > 0)
		{
			this.y = (bottom - 1) * tile_size + 10;
			//this.x += speedX;
			speed -= 0.2;
			flagY = -flagY;
		}
		else
		{
			this.y += speedY;
		}
	}

	speed -= fric;
				
	if (speed <= 0)
		isMovin = false;
}

As you all can see I am only testing the top(similar for bottom, right and left) collision only if both the variables are blocked like top_right and top_left both are equal to one then only I will change the direction.

The problem comes when only one of the variable is one (that is maybe top_right is 1 and top_left is not) then the ball goes straight or movement becomes jittery cause I havent added the code for checking with single variable. My issue is that for any given variable for eg if top_right is one then the ball can be colliding either on bottom of that tile or on the left hand side of that tile, I am not able to diagnose that properly…
Here is pic of that issue:-

So the ball can be moving in direction 1 and it hits left hand side of tile and direction 2 hits bottom of the tile… how to diagnose which direction it hits.
Any help will be appreciated.

 
Flag Post

This will help you:

http://www.kongregate.com/forums/4-game-programming/topics/259954-aabb-sweep-test-tutorial

 
Flag Post

Thanks for that. You are awesome. Its taking some time for my fuzzy brain to register what is going on in that code… I will check on that later…