Стрельба по врагу, как рассчитать следующую позицию снаряда - PullRequest
1 голос
/ 05 ноября 2011

У меня есть Башня с позицией Vector2, которая стреляет в цель, когда подхожу достаточно близко.Снаряд должен наследовать позицию башни в качестве стартовой позиции, и затем он получает целевой вектор 2, который должен ударить.

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

Ответы [ 2 ]

3 голосов
/ 06 ноября 2011

Если у вас есть target и origin, то просто выполнение target-origin дает вам новый Vector2, который является направлением. Затем вам нужно нормализовать этот вектор направления и умножить его на скорость снаряда.

псевдокод:

Vector2 target = objectToShootAt.position();
Vector2 origin = tower.position();
Vector2 direction = target - origin;

direction.normalize(); // or direction *= 1/direction.length()
direction *= speed;

Затем просто используйте направление и умножьте его на время между кадрами и добавьте это к позиции маркера.

Редактировать: следить за комментарием Джорджа Псевдокод, который я показал, всегда будет пропускать цель, если цель движется, поскольку предполагается, что пуля не может изогнуться и не учитывает скорость цели. Если пуля изгибается, как сказал Джордж, вам нужно пересчитать вектор направления каждого кадра.

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

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

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

  Equation from Enemy => Target = EnemyOrigin + EnemyDirection.Normalized * EnemySpeed * Time;

  Equation from Tower => Target = TowerOrigin + BulletDirection.Normalized * BulletSpeed * Time;

  Target = EO + ED * ES * T, Target = TO + BD * BS *T =>

                                               (EO - TO) + ED * ES * T 
=> EO + ED * ES * T = TO + BD * BS * T => BD = -----------------------
                                                        BS * T

Теперь мы не знаемВремя, но мы можем приблизить его, (пули будут иметь разную скорость относительно расстояния):

Time = |(EnemyOrigen - TowerOrigen) / BulletSpeed| = |(EO - TO) / BS|;

         (EO  - TO )+ ED * ES * (EO - TO) / BS
=> BD = ---------------------------------------- =>   (+-1) * (One + (ED * ES) / BS);
                 BS * (EO - TO) / BS

Теперь мы знаем BulletDirection, BulletOrigen и продолжительность полета, мы должны только интерполировать

BulletPos = TowerOrigin + BulletDirectionNormalized * BulletSpeed ​​* TimeElapsedFromShot;

Я не проверял это, и, возможно, это не хорошее решение .., но только для того, чтобы показать другую альтернативу ...;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...