2d игра: стреляйте по движущейся цели, предсказывая пересечение снаряда и юнита - PullRequest
20 голосов
/ 12 февраля 2010

Хорошо, все это происходит в красивом и простом 2D мире ...:)

Предположим, у меня есть статический объект A в позиции Apos, и линейно движущийся объект B в Bpos с bVelocity, и патрон с патроном со скоростью Avelocity ...

Как бы я узнал, какой угол должен стрелять А, чтобы попасть в В, учитывая линейную скорость В и скорость боеприпасов А?

Прямо сейчас цель находится в текущей позиции объекта, что означает, что к тому времени, когда мой снаряд попадет туда, юнит переместится в более безопасные позиции:)

Ответы [ 11 ]

0 голосов
/ 06 ноября 2013

Я видел много способов решить эту проблему математически, но это был компонент, относящийся к проекту, который должен был выполнять мой класс в старшей школе, и не у всех в этом классе программирования были знания по исчислению или даже векторы в этом отношении, таким образом, я создал способ решить эту проблему с большим количеством подхода программирования. Точка пересечения будет точной, хотя она может попасть на 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++
}
...