Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么我的碰撞系统不是';工作不正常吗?_C++_Collision Detection_Sfml - Fatal编程技术网

C++ 为什么我的碰撞系统不是';工作不正常吗?

C++ 为什么我的碰撞系统不是';工作不正常吗?,c++,collision-detection,sfml,C++,Collision Detection,Sfml,我正在用SFML和Tile系统做一个游戏。 我正在使用此库解析地图并处理冲突: 基本检测工作正常,但关键是在我的对象位置和我的精灵碰撞之间切换 当我向底部和右侧方向移动时,碰撞正常工作,但当我向顶部和左侧移动时,会发生~2个瓷砖的移动 所以我猜我做错了什么。。 当我前进时,我会这样做: else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Z)) { movement.y -= demonist->getSpeed(); de

我正在用SFML和Tile系统做一个游戏。 我正在使用此库解析地图并处理冲突:

基本检测工作正常,但关键是在我的对象位置和我的精灵碰撞之间切换

当我向底部和右侧方向移动时,碰撞正常工作,但当我向顶部和左侧移动时,会发生~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);
}
bool-ACharacter::collision(const-sf::Vector2f&coord,const-tmx::MapLoader&map)const
{
const std::vector&layers=map.GetLayers();
sf::Vector2f-tmp;
std::cout _y+(coord.y*g_time.asSeconds());
矢量播放器;
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\u x我通过将精灵的原点设置到图像的中心来解决我的问题。因此,我的盒子的坐标变为

  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));

我的玻璃球说这是因为SFML将形状的中心点放在左上角,而碰撞系统将形状的中心点放在中心。可以使用
sf::Shape::setOrigin
在SFML中设置中心点,使其与碰撞系统相同,偏移量将消失。occas知道我的玻璃球我可能错了。