Как сделать обнаружение столкновений с помощью карты сетки, если я могу вращать своего персонажа?

Хорошо, так что это довольно сложно для меня, чтобы сказать это, но здесь идет.

Я пытаюсь создать игру, похожую на Crazy Taxi, где это игра сверху вниз, а игрок управляет автомобилем. На картинках ниже красная коробка — моя машина, а я делю остальную часть карты на сетки. Размер машины и сетки 25 на 25, так что да, машина размером 1 сетка. Теперь я попытался исследовать, как сделать столкновение с сеткой карт, и получил следующую ссылку:
http://www.emanueleferonato.com/2012/05/24/the-guide-to-implementing-2d-platformers/

Итак, я пришел с этим в моей функции CheckCollision:

    // which tile are you at?
int tileX = (int) playerPos.x  / TILE_SIZE;
int tileY = (int) playerPos.y / TILE_SIZE;

if (right)
{
if (m_Map->GetGrid(tileX + 1, tileY).GetID() == ROAD_BORDER_LEFT  ||
m_Map->GetGrid(tileX + 1, tileY).GetID() == ROAD_BORDER_RIGHT ||
m_Map->GetGrid(tileX + 1, tileY).GetID() == ROAD_BORDER_UP ||
m_Map->GetGrid(tileX + 1, tileY).GetID() == ROAD_BORDER_DOWN)
{
return true;
}
}

if (up)
{
if (m_Map->GetGrid(tile_X, tile_Y - 1).GetID() == ROAD_BORDER_LEFT  ||
m_Map->GetGrid(tile_X, tile_Y - 1).GetID() == ROAD_BORDER_RIGHT ||
m_Map->GetGrid(tile_X, tile_Y - 1).GetID() == ROAD_BORDER_UP ||
m_Map->GetGrid(tile_X, tile_Y - 1).GetID() == ROAD_BORDER_DOWN)
{
return true;
}
}

И я проверяю направо, налево, вверх и вниз. Теперь проблема в том, что я понял, что ссылка была для игр с фиксированной осью (например, игры с боковой прокруткой). Для моей игры я могу вращать машину и двигаться вперед в зависимости от этой оси. Например. если моя машина направлена ​​вправо, и я нажимаю ‘w’, машина едет направо, а не вверх.

Поэтому мой вопрос, который я считаю, должен быть следующим: как отслеживать, какие сетки нужно проверять в зависимости от направления движения моей машины? Я просто хочу проверить, что находится впереди, сзади и по бокам моей машины. Например. если что-то впереди, я не могу двигаться вперед.

PS. Я могу свободно перемещаться по карте. Это означает, что моя машина может быть между двумя сетками.

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ:

Мой код для продвижения моей машины:

if (CInputManager::GetInstance()->GetKeyDown('w') &&
!CheckCollision(m_Player->GetPosition(), false, false, true, false))
{
// increase acceleration
m_Player->MoveForward();

Мой код для поворота направо:

if (CInputManager::GetInstance()->GetKeyDown('d') /*&&
!CheckCollision(m_Player->GetPosition(), true, false, false, false)*/)
{
m_Player->TurnRight();
// inside the TurnRight function is:
// using polar coordinates as direction
/*
m_fDirAngle+=6; // its plus instead of minus because of the orthoganal axises

if (m_fDirAngle >= 360)
{
m_fDirAngle = 0;
}
*/

И вот как я двигаю машину:

Vector2 CCar::GetDirection(void)
{
// useful link: http://www.mathsisfun.com/polar-cartesian-coordinates.html
// remember to convert to radians and remember to -360 because of the different rotation (cc vs clockwise)
double deltaRadian = m_fDirAngle * (PI/180.0);

m_dir.Set( cos( deltaRadian ), sin( deltaRadian ));
return m_dir;
}

void CCar::Update()
{
Vector2 move;
move.Set(GetDirection().x * (m_fSpeed + m_fCurAcceleration), GetDirection().y * (m_fSpeed + m_fCurAcceleration));

this->m_pos.Set(m_pos.x + move.x, m_pos.y + move.y);
}

помощь 1

введите описание изображения здесь

3

Решение

По сути, вы ищете прямоугольные пересечения без выравнивания по оси. Вот некоторая информация о том, как справиться с таким сценарием:

Площадь пересечения прямоугольника с прямоугольником

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]