@IliaNeverov

Как нормально сделать перемещение по диагонали (sfml)?

Всем доброго времени суток! Подскажите пожалуйста как реализовать нормальное "справедливое" передвижение по диагонали?
if (sf::Keyboard::isKeyPressed(sf::Keyboard::W)) {
		Sprite.move(0,-speed);
	}
	if (sf::Keyboard::isKeyPressed(sf::Keyboard::A)) {
		Sprite.move(-speed, 0);
	}
	if (sf::Keyboard::isKeyPressed(sf::Keyboard::S)) {
		Sprite.move(0, speed);
	}
	if (sf::Keyboard::isKeyPressed(sf::Keyboard::D)) {
		Sprite.move(speed, 0);
	}

Когда жму одновременно 2 кнопки например s и d спрайт перемещается на большее расстояние чем должен , подскажите как нормально сделать чтобы при нажатии тех же s и d перемещался спрайт нормально
  • Вопрос задан
  • 181 просмотр
Решения вопроса 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Считайте вектор скорости и потом делите на его длину. В зависимости от зажатых кнопок прибавляйте или вычитайте speed из vx или vy (которые изначально 0). Потом, после проверок, делите оба числа на sqrt(vx*vx+vy*vy) (если оно не 0) и сдвигайте спрайт на vx, vy.

Можно соптимизировать - прибавляйте 1/-1 вместо speed. Тогда значение vx*vx+vy*vy может быть только 0,1 или 2. Заведите константный массив kScaleCoef[3] = {1, 1, sqrt(2)} и потом делайте
Sprite.Move(speed/kScaleCoef[vx*vx+vy*vy]*vx, speed/kScaleCoef[vx*vx+vy*vy]*vy);
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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