Я видел много способов решить эту проблему математически, но это был компонент, относящийся к проекту, который должен был выполнять мой класс в старшей школе, и не у всех в этом классе программирования были знания по исчислению или даже векторы в этом отношении, таким образом, я создал способ решить эту проблему с большим количеством подхода программирования. Точка пересечения будет точной, хотя она может попасть на 1 кадр позже, чем в математических вычислениях.
Рассмотрим:
S = shooterPos, E = enemyPos, T = targetPos, Sr = shooter range, D = enemyDir
V = distance from E to T, P = projectile speed, Es = enemy speed
В стандартной реализации этой задачи [S, E, P, Es, D] все даны, и вы решаете либо найти T, либо угол, под которым стрелять, чтобы попасть в T в нужное время.
Основным аспектом этого метода решения проблемы является рассмотрение дальности стрелка в виде круга, охватывающего все возможные точки, которые могут быть сняты в любой момент времени. Радиус этого круга равен:
Sr = P*time
Где время вычисляется как итерация цикла.
Таким образом, чтобы найти расстояние, пройденное врагом по временной итерации, мы создаем вектор:
V = D*Es*time
Теперь, чтобы действительно решить проблему, мы хотим найти точку, в которой расстояние от цели (T) до нашего стрелка (S) меньше, чем дальность действия нашего стрелка (Sr). Вот несколько реализаций псевдокода для этого уравнения.
iteration = 0;
while(TargetPoint.hasNotPassedShooter)
{
TargetPoint = EnemyPos + (EnemyMovementVector)
if(distanceFrom(TargetPoint,ShooterPos) < (ShooterRange))
return TargetPoint;
iteration++
}