Хорошо, так что мне сложно говорить это, но здесь.Как мне обнаружить столкновение с сеткой, если я могу повернуть мой персонаж?
Я пытаюсь создать игру, похожую на 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);
}
Если вы, ребята, нужно больше информации или пояснений, просто комментарий. Я попытаюсь объяснить больше. Мне жаль, что мой английский не так уж хорош. – mh4