Как рассчитать коллизию между двумя ритами в C ++ и SDL и как сделать так, чтобы игрок не мог пройти через этот прямоугольник (т. Е. Убедиться, что один прямоугольник не может пройти через другой)?
Я знаю, что остановить игрока будет playeryvel = 0
, делая скорость игрока Y 0, чтобы они не могли пройти через нее.Моя проблема в том, что это остановит ВСЕ вертикальное движение, когда я хочу остановить движение через другой прямоугольник.
Мой текущий код использует функцию с именем check_collision(SDL_Rect, SDL_Rect)
.Вот мой код для использования и фактическая функция.
// This loops through a vector, containing rects.
for (int i=0; i<MAP::wall.size(); i++)
{
std::cout << i << std::endl;
cMap.FillCustomRect(MAP::wall.at(i), 0xFFFFFF);
if (check_collision(cMap.wall.at(i), cDisplay.getPlayer(playerx, playery)))
{
exit(0); // It exits just as an example to show if there actually is a collision
}
}
bool check_collision( SDL_Rect A, SDL_Rect B )
{
//The sides of the rectangles
int leftA, leftB;
int rightA, rightB;
int topA, topB;
int bottomA, bottomB;
//Calculate the sides of rect A
leftA = A.x;
rightA = A.x + A.w;
topA = A.y;
bottomA = A.y + A.h;
//Calculate the sides of rect B
leftB = B.x;
rightB = B.x + B.w;
topB = B.y;
bottomB = B.y + B.h;
//If any of the sides from A are outside of B
if( bottomA <= topB )
{
return false;
}
if( topA >= bottomB )
{
return false;
}
if( rightA <= leftB )
{
return false;
}
if( leftA >= rightB )
{
return false;
}
//If none of the sides from A are outside B
return true;
}