@gth-other

Как реализовать автонаводку пушек на игрока в 2D платформере?

Есть пушка с координатами (x1, y1) и игрок с координатами (x2, y2). Пушка стреляет под некоторым углом a к горизонту. Существует некоторое ускорение падения для ядра g. Необходимо найти такую начальную скорость ядра, чтобы оно, вылетев из пушки, прилетело по месту, где в момент выстрела находился игрок. Если бы пушка и игрок находились на одной высоте, то задача была бы тривиальна. Формулу ниже я вывел сам:
float v = std::sqrt(std::abs(player->getCenterX() - this->position.x) * AccelerationInAir / 2 / std::sin(Angle * M_PIf / 180) / std::cos(Angle * M_PIf / 180));

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

P.S. В голову приходила идея написать бинпоиск, но по-моему это вообще уж чушь какая-то.
  • Вопрос задан
  • 121 просмотр
Пригласить эксперта
Ответы на вопрос 2
hint000
@hint000
у админа три руки
я пришел к какому-то жесткому уравнению четвертой степени с множителями огромной длины. Возможно, пошел каким-то не тем путем.
Траектория параболическая (пренебрегаем сопротивлением воздуха). Значит квадратное уравнение и никаких четвёртых и даже третьих степеней. Построение параболы по любым известным её параметрам легко нагугливается (в вашем случае парабола проходит через (x1, y1) и через (x2, y2)). Почитайте про похожую (но более сложную из-за горных вершин) задачу здесь:
https://qna.habr.com/q/621097
Ответ написан
Комментировать
@CBET_TbMbI
Хмм... Вспомнить что ли школу)) Начну писать, пока сам не знаю, к чему приду.
Рассмотрю для простоты проекции на оси.

Скорость:
V(х) = V(0х) = конст (с какой проекцией скорости на ось Х пуля будет выпущена, с такой и полетит)
V(у) = V(0у) - g*t (будет снижаться и увеличиваться в отрицательную зону в соответствии с g и временем).

Координаты пули:
Х = х1 + V(х)*t
У = у1 + V(у)*t - (g*t^2)/2

Нам нужно, чтобы пуля попала по цели. Тогда эти уравнения превращаются в:
х2 = х1 + V(х)*t
у2 = у1 + V(у)*t - (g*t^2) / 2

Из них можно выразить Нужные нам скорости.
V(х) = (х2 - х1) / t
V(у) = (у2 - у1 + (g*t^2)/2) / t
Это 2 уравнения с 3 неизвестными V(у), V(х), t.
Если сюда подставлять время полёта пути до цели, можно получить начальную скорость.

Но у нас задан угол вылета пули. По сути задано соотношение V(х)/V(у). Обозначу его через К.
Тогда V(х) = V(у)*К
И можно записать
V(у) * К = (х2 - х1) / t
V(у) = (у2 - у1 + (g*t^2)/2) / t
Это уже 2 уравнения с 2 неизвестными.
Из первого можно выразить t и поставить во второе.
Далее неудобно набирать на компе (дроби плохо видны), а на бумажке писать лень.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы