#pragma once #include "utils/easing.hpp" namespace Scenes { // Interpola una posició 2D entre dos punts durant un temps donat amb // una funció d'easing. No toca cap surface — el caller llegix x()/y() // i fa el blit ell mateix. Pensat per a scrolls, sprites que entren/ // ixen per pantalla, i moviments d'objectes interpolats. class SpriteMover { public: using EaseFn = float (*)(float); SpriteMover() = default; // Arrenca un moviment nou. Si ja n'hi havia un en curs, es descarta. void moveTo(int x0, int y0, int x1, int y1, int duration_ms, EaseFn ease = Easing::linear); // Posicionament immediat (útil per a "teleportar" entre moviments). void setPosition(int x, int y); void tick(int delta_ms); [[nodiscard]] auto x() const -> int { return cur_x_; } [[nodiscard]] auto y() const -> int { return cur_y_; } [[nodiscard]] auto done() const -> bool { return elapsed_ms_ >= duration_ms_; } [[nodiscard]] auto progress() const -> float; // 0..1 sense easing aplicat private: int x0_{0}, y0_{0}, x1_{0}, y1_{0}; int duration_ms_{0}; int elapsed_ms_{0}; int cur_x_{0}, cur_y_{0}; EaseFn ease_{Easing::linear}; }; } // namespace Scenes