У меня проблема в моем нынешнем игровом хобби.У меня есть две единицы, которые враждебны в 2D-пространстве.Один из них стреляет прямо в противника, поэтому, если он двигается, он промахивается.Но другой должен предсказывать движение своих противников и стрелять «вперед».
Давайте предположим, что первая единица - это А, а вторая - B. Я могу рассчитать их расстояния, у меня есть угол обзора, и у меня есть скорость, с которойони движутся.(скорость игрока и скорость пули - это разные константы)
Я попытался с помощью аппроксимаций вычислить расстояние между A и B, а затем использовать Bv и угол ориентации, чтобы вычислить, где B будет в следующую секунду, а затем масштабировать, чтобына расстоянии двух игроков, деленное на скорость пули.Но это очень неэффективно и плохо работает.
float distanceK = MathUtil.distance(unit.x, unit.y, opponent.x, opponent.y) / Constants.BULLET_VELOCITY;
float x = (float) (opponent.x + (Constants.UNIT_FORWARD_VELOCITY * distanceK * Math.cos(opponent.orientationAngle)));
float y = (float) (opponent.y + (Constants.UNIT_FORWARD_VELOCITY * distanceK * Math.sin(opponent.orientationAngle)));
float angleToRotate = MathUtil.angleBetweenUnitAndPoint(unit, x, y);
В приведенном выше примере я затем использую переменную angleToRotate
, чтобы определить, сколько мне нужно повернуть, чтобы поразить противника, но вращение тоже требует некотороговремя (54deg / s)
Мне нужно более оптимальное решение для этой проблемы.
а) предсказывать движение противника, когда вы стоите.
b) предсказывать движение противника, когда вы двигаетесь.