2014-03-11 2 views
3

Хорошо, так что мне сложно говорить это, но здесь.Как мне обнаружить столкновение с сеткой, если я могу повернуть мой персонаж?

Я пытаюсь создать игру, похожую на 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); 
} 

help 1

enter image description here

+0

Если вы, ребята, нужно больше информации или пояснений, просто комментарий. Я попытаюсь объяснить больше. Мне жаль, что мой английский не так уж хорош. – mh4

ответ

0

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

Area of rectangle-rectangle intersection

+0

также вы можете посмотреть здесь: http://stackoverflow.com/questions/2089173/non-axis-aligned-rectangle-intersection – YoungJohn

+0

hi @YoungJohn. Спасибо за быстрый ответ (и извините за мой последний), и я буду больше смотреть на него. – mh4