Hey guys, I am working on a 2D-Platformer and I having some troubles with 2D collision detection and response. The problem is with happens when the player collides with a corner, the result being the player sticks to the corners for a brief amount of time. He also snaps to corners as well.
The player is one tile in size, which means he can only collide with 4 tiles at one time. I check the four tiles within his vicinity minus the one he started in, then we change his position to the closest possible tile without making a collision. Here is the code:
void update(float dt)
{
float tempx = x + velx * dt;//The player's temporary X
float tempy = y + vely * dt;//The player's temporary y
int xdir = velx > 0 ? 1 : 0; // get x-sign using ternary operator
int ydir = vely < 0 ? 1 : 0; // get y-sign using ternary operator
velx *= 0.995;
vely += 4.9*dt;
bool q1 = world->tiles[int(tempx + xdir) + int(tempy + ydir) * 20] != 0;//Where the first quadrant is
bool q2 = world->tiles[int(tempx + xdir) + int(tempy + 1 - ydir) * 20] != 0;//Where the second quadrant is
bool q3 = world->tiles[int(tempx + 1 - xdir) + int(tempy + 1 - ydir) * 20] != 0;//Where the third quadrant is
float ttempx = tempx, ttempy = tempy;
if(velx)
{
if(q1 || (q2 && !q3)) //Checks for collision in the first quadrant
{
ttempx = xdir ? floor(tempx) : ceil(tempx);
}
}
if(vely)
{
if(q3 || (q2 && !q1))//Checks for collision in the third quadrant
{
vely = 0;
ttempy = ydir ? ceil(tempy) : floor(tempy);
}
}
float xpen = abs(ttempx - tempx);
float ypen = abs(ttempy - tempy);
if(ypen > xpen)
{
tempy = ttempy;
}
else if(ypen < xpen)
{
tempx = ttempx;
}
x = tempx;
y = tempy;
}
Can someone please tell me what is wrong with this code. Thank you.