Некоторая физическая проницательность
1) Для цели, являющейся «точечным объектом»
Таким образом, вы должны решить векторное уравнение
Позиция пуля [время = t 1 > t 0 ] == Позиция цель [время = t 1 > т 0 ] - (уравнение 1)
Где позиции задаются уравнениями движения (также ВЕКТОРА)
Позиция объект [т] = Позиция объект [т 0 ] + Скорость объект * (т - т 0 )
Теперь условием, чтобы пуля могла достичь цели, является то, что уравнение 1 имеет решения для x и y. Запишем уравнение для х:
X bullet [t 0 ] + SpeedX bullet * (t - t 0 ) = X target [t 0 ] + SpeedX target * (t - t 0 )
Итак, на время столкновения у нас есть
(t Столкновение - t 0 ) = (x target [t 0 ] - x bullet [t 0 ]) / (SpeedX bullet - SpeedX target ) - (Eq 2)
Поскольку нам нужны решения с t> t 0 , это означает, что для перехвата достаточно, чтобы>
Знак (x цель [t 0 ] - x bullet [t 0 ]) = Знак (SpeedX bullet - SpeedX target ) - (Уравнение 3)
Which tells us the evident fact that if an object is moving faster than the other, and in the same direction, they will eventually collide.
Из уравнения 2 видно, что для данной цели SpeedX target существуют бесконечные решения (как уже указывалось в других ответах) для t и SpeedX bullet , поэтому я думаю, что ваши спецификации не полны.
I guess (as stated in a commentary I made in another answer) thinking in a "tower defense" kind of game, that your bullets have a limited range.
Так что вам нужно еще одно ограничение:
Расстояние [Позиция цель [т Столкновение - т 0 ] - Позиция пуля [т 0 ]]
Which still permits infinite solutions, but bounded by an upper value for the Collision time, given by the fact that the target may abandon the range.
Далее расстояние определяется как
Расстояние [v, u] = + Sqrt [(Vx-Ux) ^ 2 + (Vx-Vy) ^ 2]
Итак, уравнение 4 становится,
(Х цель [т Столкновение - т 0 ] - Х пуля [т 0 ]) 2 + (Y цель [t Столкновение - t 0 ] - Y bullet [t 0 ]) 2 2 - (уравнение 5)
Обратите внимание, что {X bullet [t 0 ], Y bullet [t 0 } - это положение башни.
Теперь, заменив в уравнении 5 значения для целевой позиции:
(X target [t 0 ] + SpeedX target * (tt 0 ) - X bullet [t 0 ]) 2 + (Y target [t 0 ] + SpeedY target * (tt 0 ) - Y bullet [t 0 ]) 2 2 - (уравнение 6)
Называя начальные расстояния:
Dxt0 = X цель [t 0 ] - X bullet [t 0 ]
и
Dyt0 = Y target [t 0 ] - Y bullet [t 0 ]
Уравнение 6 становится
(Dtx0 + SpeedX target * (tt 0 )) 2 + (Dty0 + SpeedY target * (tt 0 )) 2 2 - (уравнение 7)
Какое квадратное уравнение решается в t-t0. Положительное решение даст нам наибольшее время, отведенное для столкновения. После этого цель будет вне диапазона.
Сейчас звонит
Скорость цель 2 = СкоростьX цель 2 + Скорость Y цель 2
и
H = Dtx0 * SpeedX цель + Dty0 * SpeedY цель
T Максимальное столкновение = t 0 - (H +/- Sqrt (BulletRange 2 * Скорость цель 2 - В 2 )) / скорость цель 2
So you need to produce the collision BEFORE this time. The sign of the
square root should be taken such as the time is greater than t<sub>0</sub></p>
<pre><code>After you select an appropriate flying time for your bullet from the visual
effects point of view, you can calculate the SpeedX and SpeedY for the bullet
from
SpeedX bullet = (X target [t 0 ] - X bullet [t 0 ]) / (t Столкновение - t 0 ) + SpeedX target
и
SpeedY bullet = (Y target [t 0 ] - Y bullet [t 0 ]) / (т Столкновение - т 0 ) + Скорость Y цель 2) Для цели и башни, являющейся «Обширными объектами»
Теперь тривиально обобщить на случай, если целью является окружность радиуса R. То, что вы получаете, является эквивалентом «расширенного объекта».дальность »для пуль.Это расширение просто R.
Итак, заменив BulletRange на (BulletRange + R), вы получите новые уравнения для максимально допустимого времени столкновения.
Если вы также хотите учесть радиус для пушек, примените те же соображения, давая «двойной расширенный диапазон»
NewBulletRange = BulletRange + R Target + R Башня
Пули с неограниченным радиусом действия
В случае, если вырешите, что некоторые особые маркеры не должны иметь ограничений по дальности (и обнаружению), все еще есть ограничение границы экрана. Но это немного сложнее для решения. Если вам нужен такой вид снаряда, оставьте комментарий, и я постараюсьсделать математику.