@a1nsworth

Как сделать коллизии для вращающейся фигуры SFML?

Дело в том, что для левой и для правой стороны у меня коллизия относительно нормально работает. Но для нижней и правой , оно не работает должным образом.
void update()
	{
		const auto positionPlayer = player->getPositionSprite();
		const auto playerSprite = player->getSprite();

		// Collision Left
		if (auto x = player->getPositionSprite().x - player->getOrigin().x; x < floatRect.top)
		{
			player->setPositionSprite(floatRect.top + player->getOrigin().x, player->getPositionSprite().y);
		}
		// Collision Top
		if (auto y = player->getPositionSprite().y - player->getSprite().getOrigin().y; y < floatRect.left)
		{
			player->setPositionSprite(positionPlayer.x, floatRect.left + player->getOrigin().y);
		}

		// Collision Right
		if (auto x = player->getPositionSprite().x - player->getOrigin().x; x + (player->getGlobalBounds().width - player->getOrigin().x) >
			floatRect.width)
		{
			player->setPositionSprite(
				floatRect.width - (player->getGlobalBounds().width + player->getOrigin().x),
				player->getPositionSprite().y);
		}
		// Collision Bottom
		if (auto y = player->getPositionSprite().y - player->getOrigin().y; y + (player->getGlobalBounds().height -
			player->getOrigin().y) > floatRect.height)
		{
			player->setPositionSprite(player->getPositionSprite().x,
			                          floatRect.height - (player->getGlobalBounds().height - player->getOrigin().y));
		}
	}

Коллизия происходит с картой(с рамкой у меня по краям карты рамка) размером 1659 на 869
Игрок с цетром в точке Origin(25;39.5 ) . К тому же он еще и вращается вокруг центра
  • Вопрос задан
  • 154 просмотра
Пригласить эксперта
Ответы на вопрос 1
@code_panik
Upd: sfml не предоставляет средств для работы с физикой. Разрешение коллизий придется реализовать самому, пример.

Нужно начать с того, что разрешение коллизий выполняется не для спрайта, который существует только для отображения объекта, а для связанной с объектом формы (множеством форм) - коллайдера (collider) (прямоугольника, окружности, параллелепипеда, сферы и т.п.). Коллайдер представляет собой упрощенную форму игрового объекта. Работа с такими формами значительно упрощает разрешение коллизий.

В двумерном платформере коллайдером может быть прямоугольник. Если объект имеет квадратную форму, и мы можем пожертвовать столкновением с углами, то коллайдером можно выбрать аккуратно подогнанную по размеру окружность. Распространенный вид коллайдера - AABB (axis aligned bounding box), прямоугольник, стороны которого всегда параллельны осям координат. При повороте игрового объекта достаточно изменить размеры такого прямоугольника, чтобы объект оставался в его границах.

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

Если нужно реализовать именно игру, то посмотрите в сторону библиотек с готовыми реализациями. Если проект учебный, выберите простую форму коллайдера, например aabb или окружность, и поищите для них примеры разрешения коллизий. Примеров множество.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы