2013-12-26 3 views
3

Я пробовал в течение нескольких дней и тратил часы на поиски в Интернете безрезультатно. У меня проблемы с столкновением, я могу обнаружить столкновение, но моя проблема не позволяет игроку войти в плитку. Я пробовал все, что мог придумать. Я обнаружение столкновения моего tilemap с использованием 1 для твердых и 0 для пассивногоCollision C++ 2d game, предотвращающий вход игрока в плитку

for(int i = 0; i < tiles.size(); i++) 
    { 
     if(colMap[tiles[i].y][tiles[i].x] == 1) 
     { 
      myrect.setFillColor(sf::Color::Red); 
      collide = true; 
      break; 
     } 
     else 
     { 
      collide = false; 
      break; 
     } 
    } 

Это работает нормально, мой текст игрок краснеет один раз сталкиваясь с плиткой, но я не могу понять, как предотвратить игрок, входящее что плитка для начала, моя текущая настройка я попытался отключить движение, но все, что происходит, входит в столкновение, установлено в true, а элементы управления отключены, что приводит к тому, что игрок полностью застрял.

мое текущее движение является очень основным

if(sf::Keyboard::isKeyPressed(sf::Keyboard::Left)) 
{ 
    if(walking == false) 
    { 
     //colCheck(); 
     if(!collide) 
     { 
     nextspot = x - tilesize; 
     move[LEFT] = true; 
     walking = true; 
     }else 
     { 
      std::cout << "Collsion!" << std::endl; 
     } 
    } 
} 

Любая помощь очень ценится.

+2

Если движение приводит к столкновению, восстановите положение игроков до того, что было до столкновения. Или, * если * движение приведет к столкновению, не перемещайте игрока. – hyde

+0

Это было бы лучше подходит для обмена играми (dot). – Grey

+0

Просто из любопытства, как вы рисуете свою карту? Какая ОС? –

ответ

3

Вы должны всегда записывать, где ваш игрок был один поворот перед:

static int prevY, prevX; 

for(int i = 0; i < tiles.size(); i++) 
{ 
    if(colMap[tiles[i].y][tiles[i].x] == 1) 
    { 
     myrect.setFillColor(sf::Color::Red); 
     collide = true; 

     /* Return Player To Where He's Been */ 
     colMap[prevY][prevX] = 1; 

     break; 
    } 
    else 
    { 
     collide = false; 
     break; 
    } 
} 

Другой метод будет смотреть вперед, прежде чем перейти:

for(int i = 0; i < tiles.size(); i++) 
{ 
    /* Look Ahead (Depends On Which Way He's Trying To Go)*/ 
    if(colMap[tiles[i].y + newY][tiles[i].x + newX] == 1) 
    { 
     myrect.setFillColor(sf::Color::Red); 
     willCollide = true; 
     break; 
    } 
    else 
    { 
     willCollide = false; 
     break; 
    } 
} 

newY и newX может быть -1 , 0, или 1. Если либо newY, либо newX!= 0, другой должен быть 0.

+0

Спасибо за код, вы дали мне ответ, который мне нужен, код сам по себе не работал для меня, но, проверяя, будет ли игрок сталкиваться или нет, именно то, что я искал. Я комбинировал проверку столкновения с движением, и он отлично работает. спасибо – Mystic

+0

@ user3133570 Я рад, что это сработало. Ваша игра звучит весело. –