Do you think this works?
bool thereWasABottomCollision = false;
for (auto &i : m_wmap->m_fixturerects)
{
if (rect.getGlobalBounds().intersects(i))
{
float x = 0.f, y = 0.f;
if (rect.getGlobalBounds().left < i.left && i.left < rect.getGlobalBounds().left + rect.getGlobalBounds().width &&
rect.getGlobalBounds().left + rect.getGlobalBounds().width < i.left + i.width)
{
x += rect.getGlobalBounds().left + rect.getGlobalBounds().width - i.left;
}
else if (i.left < rect.getGlobalBounds().left && rect.getGlobalBounds().left < i.left + i.width &&
i.left + i.width < rect.getGlobalBounds().left + rect.getGlobalBounds().width)
{
x -= i.left + i.width - rect.getGlobalBounds().left;
}
else if (rect.getGlobalBounds().top < i.top && i.top < rect.getGlobalBounds().top + rect.getGlobalBounds().height &&
rect.getGlobalBounds().top + rect.getGlobalBounds().height < i.top + i.height)
{
y -= rect.getGlobalBounds().top + rect.getGlobalBounds().height - i.top - 2.f;
thereWasABottomCollision = true;
}
else if (i.top < rect.getGlobalBounds().top && rect.getGlobalBounds().top < i.top + i.height &&
i.top + i.height < rect.getGlobalBounds().top + rect.getGlobalBounds().height)
{
y += i.top + i.height - rect.getGlobalBounds().top;
}
move(x, y);
}
}
if (thereWasABottomCollision)
m_onair = false;
else
m_onair = true;
m_fixturerects is an std::vector<sf::FloatRect>, containing the tiles.