Mikle писал(а):Разгон и торможение - это одно и то же, они коренным образом отличаются только в 1D
Во-первых, как ты можешь наблюдать, у меня реализована возможность использовать разные ускорения для разгона и торможения. Это может быть необходимым для достижения большей аркадности там, где не нужна излишняя физичность. В этом случае корабль будет медленно разгоняться, но тормозить будет гораздо быстрее. Для этого, очевидно, нужна просто особоая
InitShipClassEx.
Mikle писал(а):если вектор скорости корабля изначально не направлен на цель, то вектор ускорения весь полёт не будет сонаправлен с вектором скорости,
Это заблуждение. Перечитай ещё раз код. В моём терминологии вектор скорости раскладывается на полезный и вредный векторы. Полезный — это ведущий корабль к цели, а вредный компонент — это скорость, сносящая корабль вбок от цели.
Как только AI корабля обнаруживает, что боковая вредная скорость не равна нуля, начинается подавление этой скорости. Эта скорость давится до нуля с максимально возможным ускорением, на последнем (последнем — в плане гашения, а не в рамках полёта) же шаге
dv специально выбирается так, чтобы за этот последний тик погасить это скорость в ноль.
- Код: Выделить всё
If Abs(side_speed * dt) > tolerance_radius Then
d_side_speed = V2Scale(ortoDir, -1 * ShipClassesTable(.iClassIndex).NormalAcceleration * dt * Sgn(side_speed))
Else
d_side_speed = V2Scale(ortoDir, -side_speed)
End If
После того, как сработает else-ветка, вектор скорости корабля на всём протяжении полёта остаётся сонаправлен вектору, смотрящему на цель.
Поэтому, боковая вредная составляющая вектора скорости гасится как правило до достижения цели, и часть полёта проходит по прямой.
Mikle писал(а):когда рост модуля сменится его уменьшением нам совершенно не интересен.
Рост модуля сменяется на неизменность модуля. Неизменность сменяется на уменьшение.
Момент смены значения поля «фаза движения» может и не важен на текущей стадии, но само поле безусловно важно: оно определяет, как вообще корректировать модуль скорости (варианты: увеличивать с ускорением TangentialAcceleration, не изменять, уменьшать с ускорением TangentialDeceleration). Оно бы могло стать локальной переменной в пределах той процедуры, где оно устанавливается, но дальновидным решением было сделать фазу — полем структуры SHIP_UNIT, потому что в этом случае в пределах игрового мира становится возможным определить, какое решение принял AI корабля, то есть, грубо говоря, жмёт он на газ или на тормоз, и в зависимости от этого, проигрывать звук ускорения или звук торможения.