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