Я пытаюсь найти хорошее решение для пули, чтобы поразить врага. В игре 2D Tower Defense, башня должна стрелять пулями и поражать врага гарантированно.
Я попробовал это решение - http://blog.wolfire.com/2009/07/linear-algebra-for-game-developers-part-1/
Упомянутая ссылка вычитает происхождение пули, а также противника (векторное вычитание). Я попробовал это, но пуля просто преследует врага.
float diffX = enemy.position.x - position.x;
float diffY = enemy.position.y - position.y;
velocity.x = diffX;
velocity.y = diffY;
position.add(velocity.x * deltaTime, velocity.y * deltaTime);
Я знаком с векторами, но не уверен, какие шаги (операции векторной математики) нужно сделать, чтобы это решение работало.
Ответы:
Ваши рассуждения были идеальными: используйте вектор, чтобы перейти от моей позиции к моей цели. Это цель вектора ; ты просто забыл скорость !
Скорость - это вектор: скорость и направление. Однако, если вы забудете нормализовать разностный вектор и умножить его на скорость пули (скаляр), вы в основном говорите, что если вы находитесь близко к цели (вектор разности мал), пуля замедляется ; в то время как если вы далеко, скорость пули больше.
Это основная проблема: вам нужно рассчитать как направление, так и величину вектора.
источник
Если цель движется в устойчивом направлении в устойчивом темпе, а траектория пули идет по прямой линии в устойчивом темпе, вы можете использовать квадратное уравнение, чтобы предсказать точное место, где они будут пересекаться, и нацелить оружие вашей башни в это место. ,
Поскольку есть уверенность, что пуля попадет в цель, и вы сможете рассчитать точное время, которое потребуется от стрельбы до удара, обнаружения столкновений не потребуется, просто стреляйте из пистолета, дождитесь рассчитанного промежутка времени, зарегистрируйте попадание.
Вот псевдокод для квадратного уравнения:
источник
Вам нужно «предсказать» положение объектов к тому времени, когда пуля достигнет его. Вы можете сделать это, используя скорость объекта / скорость (надеюсь, что это константа;)) и его вектор направления.
Я не уверен, какая точная формула у меня в голове, но я думаю, что это примерно так:
NewPosition = OldPosition + (Speed * DirectionVector);
Если у вас есть заданный путь, вам нужно будет пересчитать, когда объект меняет направление. Используйте эту NewPosition в качестве вектора врага, и пуля должна поразить объект без «эффекта самонаведения». Самонаведение происходит из-за того, что вражеский объект переместился с момента вычисления первоначального вектора, он может догнать только, когда объект движется в одном направлении достаточно долго.
Надеюсь это поможет :)
источник
Вы можете избежать использования квадратного корня и степени 2.
Это все написано по памяти. Кстати, используйте элементы, которые работают - тестируйте их построчно, если вы новичок в этом. Число с плавающей точкой в AS3.
источник