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.