# 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 библиотеки.
Сплайн представлен сегментами, т.е. участками между основными опорными точками. Для расчета с использованием библиотеки нужно рассчитать на каком сегменте находится теоретически объект и его относительное время, но только уже для данного участка.
Этот способ расчета не самый удачный, иногда встречались с потерей точности, так как много относительных значений. Но в целом он нас устроил и решили его оставить.