Прицельный расчет на 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).

Самое раннее время, когда мы можем поразить монстра, - это первое место на пути монстров (предсказанное), где монстр и пуля имеют свою роковую встречу.

Я бы начал с локации монстров, рассчитал время и локации для зверя и вычислил, если пуля прибудет раньше или позже.

Вы можете исключить одну из переменных, если просто повернетесь и отметите каждый градус или отметите, можете ли вы убить монстра, если будете стрелять сейчас. У вас будет только два вектора (прицеливание, направление движения монстра) с одной точкой пересечения, и вам просто нужно проверить, встречаются ли монстр и пуля там одновременно (расстояние до точки пересечения, скорость).

Другие вопросы по тегам