Страницы

Поиск по вопросам

среда, 26 февраля 2020 г.

Стрельба на опережение

#python #разработка_игр


Кратко опишу проблему. Есть поле (плоскость, по которой в любых направлениях двигаются
объекты), герой (он передвигается по полю в соответствием нажатия игроком клавиш) и
бот (он должен стоять на месте и стрелять в героя). 

У героя нам известны: координаты (x, y) и скорость движения (она постоянная).

У бота нам известны: координаты (x, y) и скорость его пули.

Задача состоит в том, чтобы научить бота стрелять на опережение. То есть, я могу
заставить бота стрелять в какую-то точку (могу привести код, если нужно); но в случае,
если эта точка двигается, вероятность попасть в нее очень мала.

Для удобства приведу входные и выходные данные:

ВХОДНЫЕ ДАННЫЕ: скорость движения пули и героя, текущие координаты героя, координаты
бота.

ВЫХОДНЫЕ ДАННЫЕ: направление(от 0 до 360 градусов), в котором должна полететь пуля
бота (разумеется, начальный xy пули совпадает с xy бота); ИЛИ координаты того места,
куда должен целиться бот, чтобы попасть в героя

Мне нужна формула по входным данным (код на python).
    


Ответы

Ответ 1



Можно решать систему уравнений относительно неизвестных t и f hx0 + hvx * t = bx0 + bv * cos(f) * t hy0 + hvy * t = by0 + bv * sin(f) * t hx0 - x-координата героя hvx - x-компонент скорости героя bx0 - x-координата пушки bv - значение скорости пули t - время f - угол пушки Maple подсказывает, что можно найти t как корень квадратного уравнения (hvy^2+hvx^2-bv^2) * t^2 + (2*hvy*hy0+2*hx0*hvx-2*by0*hvy-2*hvx*bx0) * t + (hy0^2+by0^2-2*hy0*by0+bx0^2-2*hx0*bx0+hx0^2) = 0 и подставить его для нахождения угла. Подставив t в первое уравнение, найдём косинус, а из второго - синус, из их комбинации уже вычислим угол f = atan2(sin(f), cos(f)) (Если использовать, например, только косинус и взять арккосинус - то получим результат с точностью до знака)

Комментариев нет:

Отправить комментарий