#pragma once #include #include #include #include "core/rendering/sprite/sprite.hpp" class Surface; class MovingSprite : public Sprite { public: MovingSprite(); explicit MovingSprite(std::shared_ptr surface); MovingSprite(std::shared_ptr surface, SDL_FRect pos); MovingSprite(std::shared_ptr surface, SDL_FRect pos, SDL_FlipMode flip); ~MovingSprite() override = default; void update(float delta_time) override; void render() override; void clear() override; [[nodiscard]] auto getPosX() const -> float { return x_; } [[nodiscard]] auto getPosY() const -> float { return y_; } [[nodiscard]] auto getVelX() const -> float { return vx_; } [[nodiscard]] auto getVelY() const -> float { return vy_; } [[nodiscard]] auto getAccelX() const -> float { return ax_; } [[nodiscard]] auto getAccelY() const -> float { return ay_; } void setPos(SDL_FRect rect); void setPos(float x, float y); void setPosX(float value); void setPosY(float value); void setVelX(float value) { vx_ = value; } void setVelY(float value) { vy_ = value; } void setAccelX(float value) { ax_ = value; } void setAccelY(float value) { ay_ = value; } void setFlip(SDL_FlipMode flip) { flip_ = flip; } [[nodiscard]] auto getFlip() const -> SDL_FlipMode { return flip_; } void flip() { flip_ = (flip_ == SDL_FLIP_HORIZONTAL) ? SDL_FLIP_NONE : SDL_FLIP_HORIZONTAL; } // Moviment eix-separat amb col·lisió: aplica `dx` (i si la nova // `collisionBox()` col·lisiona, el reverteix); després aplica `dy` // (idem). El caller calcula els deltes (típicament `vx_*dt`, // `vy_*dt`) i passa la funció de detecció. Aquesta separació deixa // que el sprite "llisqui" contra obstacles en compte de quedar-se // bloquejat en sec quan només un eix col·lisiona. using CollisionFn = std::function; void tryMove(float dx, float dy, const CollisionFn& collides); protected: void move(float delta_time); float x_{0.0F}; float y_{0.0F}; float vx_{0.0F}; float vy_{0.0F}; float ax_{0.0F}; float ay_{0.0F}; SDL_FlipMode flip_{SDL_FLIP_NONE}; };