#include "scenes/sprite_mover.hpp" #include namespace scenes { void SpriteMover::moveTo(int x0, int y0, int x1, int y1, int duration_ms, EaseFn ease) { x0_ = x0; y0_ = y0; x1_ = x1; y1_ = y1; duration_ms_ = std::max(0, duration_ms); elapsed_ms_ = 0; ease_ = ease ? ease : Easing::linear; cur_x_ = x0; cur_y_ = y0; } void SpriteMover::setPosition(int x, int y) { cur_x_ = x; cur_y_ = y; x0_ = x1_ = x; y0_ = y1_ = y; duration_ms_ = 0; elapsed_ms_ = 0; } void SpriteMover::tick(int delta_ms) { if (duration_ms_ <= 0) { cur_x_ = x1_; cur_y_ = y1_; return; } elapsed_ms_ = std::min(elapsed_ms_ + delta_ms, duration_ms_); const float t = static_cast(elapsed_ms_) / static_cast(duration_ms_); const float eased = ease_(t); cur_x_ = Easing::lerpInt(x0_, x1_, eased); cur_y_ = Easing::lerpInt(y0_, y1_, eased); } float SpriteMover::progress() const { if (duration_ms_ <= 0) return 1.0f; return static_cast(elapsed_ms_) / static_cast(duration_ms_); } } // namespace scenes