2016-01-31 3 views
0

Я делаю игру, используя SFML и систему плитки. Я использую этот LIB, чтобы разобрать мою карту и обрабатывать столкновения: https://github.com/fallahn/sfml-tmxloaderПочему моя система столкновений работает неправильно?

Основные работы по обнаружению, но сдвиг между моим положением объекта и мой спрайт столкновения.

Когда я иду в нижнем и правом направлении, столкновение работает правильно, но когда я иду сверху и влево, происходит сдвиг ~ 2 плитки.

Так я guessign я делаю что-то неправильно .. Когда я иду вперед, я делаю это:

else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Z)) 
{ 
    movement.y -= demonist->getSpeed(); 
    demonist->move(ACharacter::UP, movement, frameTime, map); 
    noKeyWasPressed = false; 
} 

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

bool   ACharacter::collision(const sf::Vector2f& coord, const tmx::MapLoader& map) const 
{ 
    const std::vector<tmx::MapLayer>& layers = map.GetLayers(); 
    sf::Vector2f tmp; 

    std::cout << g_time.asSeconds() << std::endl; 
    tmp.x = this->_x + (coord.x * g_time.asSeconds()); 
    tmp.y = this->_y + (coord.y * g_time.asSeconds()); 
    std::vector<sf::Vector2f> player; 
    player.push_back(sf::Vector2f(0, 0)); 
    player.push_back(sf::Vector2f(0 , 82)); 
    player.push_back(sf::Vector2f(82, 0)); 
    player.push_back(sf::Vector2f(82, 82)); 
    std::cout << this->_x << " " << this->_y << std::endl; 
    for(auto& layer : layers) 
    if(layer.type == tmx::ObjectGroup) 
     for(auto& obj : layer.objects) 
     if(layer.name == "Objects") 
      for(auto& point : player) 
      if(obj.Contains(point + tmp)) 
       return (true); 
    return (false); 
} 

this-_x и this->_y являются позицией моих спрайтов верхних левой координаты. И время цикла - это количество секунд, прошедших с момента моего основного цикла. Размер моего спрайта 82 * 82

+3

Мой стеклянный шар говорит, что это происходит потому, что SFML ставит центральную точку фигуры в верхнем левом углу, пока система столкновений ставит центральную точку фигуры в центре. Вы можете установить центральную точку в SFML с помощью 'sf :: Shape :: setOrigin', чтобы сделать ее такой же, как ваша система столкновений, и смещение исчезнет. Известно, что мой стеклянный шар изредка ошибается. – nwp

ответ

0

Я решил свою проблему, установив источник моего спрайта в центр моего изображения. Таким образом, координаты моего ящика стал

player.push_back(sf::Vector2f(-42, -42)); 
    player.push_back(sf::Vector2f(42 , -42)); 
    player.push_back(sf::Vector2f(42, 42)); 
    player.push_back(sf::Vector2f(-42, 42)); 
Смежные вопросы