# FISHING PATH Описывает движение игрового объекта путь. Путь содержит параметры: bool m_is_looped; //зациклен ли путь PathId_t m_path_id; // его id SplinePtr m_spline; // сплайн - описывает геометрию движения gwc::Vec2 m_offset; //смещение стартовой точки, т.е. (dX, dY) к началу пути, которое по дефолту (0, 0) gwc::Time m_start_time; //стартовое время движения - передает сервер И основной метод - ``` gui::SpatialData GetSpatialDataAtTime(gwc::Coord speed, gwc::Time time) { gwc::Time delta_time = time - m_start_time; Real_t live_time = m_spline->GetSplineLength() / speed; Real_t relative_time = 0; if (m_is_looped && delta_time > live_time) { double int_part = 0.; relative_time = modf(static_cast<double>(delta_time) / live_time, &int_part); } else { relative_time = static_cast<double>(delta_time) / live_time; } gui::SpatialData spatial_data = m_spline->GetSpatialData(relative_time); spatial_data.pos += m_offset; return spatial_data; } struct SpatialData { gwc::Vec2 pos; //позиция X,Y gwc::Vec2 dir;//единичный вектор направления, у вас это угол }; ``` Т.е. у нас нет определенного рассчитанного набора точек, выполняем расчеты в реальном времени. И по сути, игровой цикл определяет в какой момент времени ему нужно получить пространственные координаты для игрового объекта. В нашей реализации мы используем CatmullRomSpline. У сплайна основной метод GetSpatialData, который по относительному времени определяет пространственное положение. Относительное время см. выше расчет relative_time. ``` gui::SpatialData GetSpatialData(Real_t current_relative_time) { current_relative_time = cpp::clamp(current_relative_time, static_cast<Real_t>(0.0), static_cast<Real_t>(1.0)); gui::SpatialData spatial_info; auto current_segment_id = GetCurrentSplineSegmentId(current_relative_time); auto dT = GetCurrentSplineDeltaTime(current_relative_time); spatial_info.pos = Position(m_segments[current_segment_id].first, dT); spatial_info.dir = Velocity(m_segments[current_segment_id].first, dT).normalize(); return spatial_info; } ``` В этом методе уже используем расчеты с header only библиотеки. Сплайн представлен сегментами, т.е. участками между основными опорными точками. Для расчета с использованием библиотеки нужно рассчитать на каком сегменте находится теоретически объект и его относительное время, но только уже для данного участка. Этот способ расчета не самый удачный, иногда встречались с потерей точности, так как много относительных значений. Но в целом он нас устроил и решили его оставить.