39 lines
1.2 KiB
C++
39 lines
1.2 KiB
C++
#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);
|
|
|
|
int x() const { return cur_x_; }
|
|
int y() const { return cur_y_; }
|
|
bool done() const { return elapsed_ms_ >= duration_ms_; }
|
|
float progress() const; // 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
|