为什么我的碰撞系统不能正常工作?

时间:2016-01-31 20:19:38

标签: c++ collision-detection sfml

我正在使用SFML和Tile System进行游戏。 我正在使用这个lib来解析我的地图并处理碰撞: https://github.com/fallahn/sfml-tmxloader

基本检测有效但是我的对象位置和我的精灵碰撞之间的转换。

当我到达底部和右方向时,碰撞工作正常,但是当我向上和向左移动时,有~2个瓷砖的移位。

所以我猜我做错了什么.. 当我前进时,我这样做:

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-_xthis->_y是我的精灵左上角坐标的位置。 而frametime是自我的主循环以来经过的秒数。 我的精灵的大小是82 * 82

1 个答案:

答案 0 :(得分: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));