Расчет прицеливания в Tower-Defense

Я создаю небольшую игру в жанре Tower Defense с друзьями на Java. Сейчас мне назначена логика для башен, и в данный момент я пытаюсь понять, как башня должна повернуться, чтобы прицелиться и поразить целевого монстра. Поскольку монстр движется дальше, пока башня поворачивается и стреляет, ему нужно целиться в будущую позицию. Я реализовал функцию, которая дает мне положение монстра в любой момент времени t, а также функцию, которая дает мне меньший угол, необходимый для поворота к монстру, но теперь я запутался, потому что есть три неизвестные переменные:

  • t1 или угол: время или угол, на который башня должна повернуться (задается скорость, с которой может повернуться башня)
  • t2 или дистанция выстрела: время, необходимое пуле, чтобы попасть в цель (скорость также задана, постоянная).
  • t3 или расстояние перемещения: расстояние, которое монстр проходит за то же время.

Итак, я ищу решение для:

min(t1+t2) = min(t3)

где целевой монстр все еще находится в пределах досягаемости башни. Я уже думал о расчете с максимально необходимым поворотом и максимально возможной дальностью, а затем с пошаговым уменьшением, но мне любопытно, есть ли «идеальное» неэвристическое решение?


person Fabian Fritz    schedule 19.09.2011    source источник


Ответы (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). Если это значение отрицательное, монстр был слишком быстрым и достиг башни до того, как пуля выстрелила.

person rocksportrocker    schedule 19.09.2011
comment
Пожалуйста, проверьте свои первые абзацы - сначала phi это скорость, позже это угол (phi должен быть угол, omega угловая скорость). Затем: t=0 — это время, когда башня начинает вращаться, phi(t0) — начальный угол. - person Andreas Dolk; 19.09.2011
comment
Дальше - думаю вы предположили, что все монстры направляются к башне. Вопрос звучит так, будто в этой игре дело обстоит иначе: монстры перемещаются по доске, и башни пытаются их достать как можно быстрее. - person Andreas Dolk; 19.09.2011
comment
Да, я предполагал, что монстры направляются к башне. Но переписать уравнения для общих движений монстров можно. Кто-нибудь заинтересован? - person rocksportrocker; 19.09.2011
comment
Я до сих пор не уверен, есть ли у нас единственное решение или набор решений. Если у нас есть набор, нам все равно придется найти лучшее решение (которое будет min (t)) - person Andreas Dolk; 19.09.2011
comment
да. Для монстра, идущего в произвольном направлении, составление уравнения не имеет особого смысла. Вместо установки s=t вы должны минимизировать |s-t|. И если это минимальное значение равно нулю, пуля попадает в монстра. - person rocksportrocker; 19.09.2011
comment
Путь, по которому пойдет монстр, задан, так что он не совсем произволен, не так ли? Но, конечно, он не всегда будет направляться к башне. Меня не очень волнует необходимое время; в конце концов, меня интересует только момент, когда башня может поразить монстра как можно раньше. Но время должно быть равным, иначе пуля долетит до цели поздно или слишком рано, не так ли? - person Fabian Fritz; 19.09.2011
comment
Как дается путь? это фиксированный путь или они движутся в фиксированном направлении с фиксированной скоростью??? - person rocksportrocker; 19.09.2011
comment
Не зная точного пути, у вас есть шанс найти правильное время и угол для выстрела пули только в том случае, если угловая скорость башни и скорость пули намного выше скорости монстра. - person rocksportrocker; 20.09.2011
comment
Путь задан в виде путевых точек, к которым монстр движется прямолинейно. Как я уже говорил, у меня уже есть функция, которая сообщает мне точное положение монстра в данный момент времени. - person Fabian Fritz; 22.09.2011

Для каждой координаты мы можем вычислить время tB, необходимое для того, чтобы пуля попала в это место. Это время поворота плюс время, необходимое пуле (t1 + t2).

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

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

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

person Andreas Dolk    schedule 19.09.2011