The code is as follows:
//if the block's origin is within 32px of the actor
if(collision[r][c]->GetPosition().x >= (a.x + av.x) - 32 &&
collision[r][c]->GetPosition().x <= (a.x + av.x) + 32 &&
collision[r][c]->GetPosition().y >= (a.y + av.y) - 32 &&
collision[r][c]->GetPosition().y <= (a.y + av.y) + 32)
{
MyRect b = collision[r][c]->GetPosition();
//Actor collision left
if(a.left() + av.x < b.right() &&
a.right() > b.left() &&
(a.top() < b.bottom() &&
a.bottom() > b.top()) &&
av.x < 0)
{
MyRect newVel = av;
newVel.x = 0;
act->SetVelocity(&newVel);
MyRect newPos = a;
newPos.x = (b.x + b.w);
act->Move(&newPos);
}
//Actor collision right
if(a.right() + av.x > b.left() &&
a.left() < b.right() &&
(a.top() < b.bottom() &&
a.bottom() > b.top()) &&
av.x > 0)
{
MyRect newVel = av;
newVel.x = av.x - av.x;
act->SetVelocity(&newVel);
MyRect newPos = a;
newPos.x = (b.x - a.w);
act->Move(&newPos);
}
//Actor collision Top
if(a.top() + av.y < b.bottom() &&
a.bottom() > b.top() &&
a.left() < b.right() &&
a.right() > b.left() &&
av.y < 0)
{
act->jumping = false;
MyRect newVel = av;
newVel.y = 1;//-(av.y < 0 ? av.y/2 : -1);
act->SetVelocity(&newVel);
MyRect newPos = a;
newPos.y = (b.y + b.h);
act->Move(&newPos);
}
//Actor collision Bottom
if(a.bottom() + av.y > b.top() &&
a.top() + av.y < b.bottom() &&
a.left() < b.right() &&
a.right() > b.left() &&
av.y > 0)
{
MyRect newVel = av;
newVel.y = 0;
act->SetVelocity(&newVel);
MyRect newPos = a;
newPos.y = (b.y - a.h);
act->Move(&newPos);
groundCollided = true;
act->jumping = false;
}
}
if(!groundCollided)
{
act->isOnGround = false;
}
else {
act->isOnGround = true;
}
Where a = the actor's current rectangle
Where av = the actor's velocity
Where b = the collision tile's rectangle
What happens currently is that the actors warp inside walls when moving into corners, which causes them to accelerate very fast until the character is out of the wall. Which often leads to the character is off the screen and then killed.
I've tried several different things but I'm not entirely sure how to fix it, any help would be greatly appreciated!
A video of the problem can be found here