Прицельный расчет на Tower-Defense
Я строю небольшую игру Tower Defense с друзьями на Java. Теперь мне назначена логика для башен, и в данный момент я пытаюсь выяснить, как башня должна повернуться, чтобы прицелиться и поразить целевого монстра. Поскольку монстр движется, пока башня поворачивается и стреляет, ему нужно стремиться к будущей позиции. Я реализовал функцию, которая дает мне положение монстра в любое время t, а также функцию, которая дает мне меньший угол, необходимый для превращения в монстра, но теперь я запутался, потому что есть три неизвестные переменные:
- t1 или угол: время или угол, на который башня должна повернуться (указана скорость, с которой башня может поворачиваться)
- t2 или расстояние стрельбы: время, которое пуля должна пройти, чтобы поразить цель (также указана скорость, постоянная).
- t3 или расстояние перемещения: расстояние, которое монстр проходит за одно и то же время.
Поэтому я ищу решение для:
min(t1+t2) = min(t3)
где целевой монстр все еще находится в зоне действия башни. Я уже думал о расчете с максимально необходимым поворотом и максимально возможным диапазоном, а затем пошаговым уменьшением, но мне интересно, есть ли "идеальное" неэвристическое решение?
2 ответа
ДОБАВЛЕННАЯ ИНФОРМАЦИЯ:
Я предполагаю, что данный монстр имеет расстояние D до башни, движется по кратчайшему пути к башне, и башня начинает поворачиваться к монстру. Это ситуация на t=0
,
ФИКСИРОВАННЫЕ ТИПО:
Если ваша башня вращается с угловой скоростью omega
то есть угол phi
вовремя t
является
phi = omega * t
Так что, если вы знаете, что ваша башня должна повернуть на угол phi
, пуля будет застрелена
t = phi/omega
От этого на расстоянии которого скорость пули v
путешествовал
s(t) = v * (t-phi/omega)
Если ваш монстр движется со скоростью vm
монстр будет на расстоянии d
d(t) = D - vm * t
Пуля попадает в монстра, если
s(t) = d(t)
Это уравнение легко решить: просто подставим d(t)
а также s(t)
и изменить условия получения t
:
t = (D + v * phi/omega) / (phi/omega + vm)
И пуля будет путешествовать s(t)
в этот момент. Если это значение отрицательно, монстр был слишком быстр и достиг башни, прежде чем пуля была выпущена
Для каждой координаты мы можем вычислить время tB, которое нам нужно, чтобы иметь пулю в этом месте. Это время поворота плюс время, необходимое пули (t1 + t2).
Самое раннее время, когда мы можем поразить монстра, - это первое место на пути монстров (предсказанное), где монстр и пуля имеют свою роковую встречу.
Я бы начал с локации монстров, рассчитал время и локации для зверя и вычислил, если пуля прибудет раньше или позже.
Вы можете исключить одну из переменных, если просто повернетесь и отметите каждый градус или отметите, можете ли вы убить монстра, если будете стрелять сейчас. У вас будет только два вектора (прицеливание, направление движения монстра) с одной точкой пересечения, и вам просто нужно проверить, встречаются ли монстр и пуля там одновременно (расстояние до точки пересечения, скорость).