我正在使用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-_x
和this->_y
是我的精灵左上角坐标的位置。
而frametime是自我的主循环以来经过的秒数。
我的精灵的大小是82 * 82
答案 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));