#pragma once #include #include #include class Surface; class Sprite { public: Sprite(); Sprite(std::shared_ptr surface, float x, float y, float w, float h); Sprite(std::shared_ptr surface, SDL_FRect rect); explicit Sprite(std::shared_ptr surface); virtual ~Sprite() = default; // Hook d'actualització per frame. Base buida (no hi ha Sprite pur a // actualitzar); les subclasses mòbils/animades fan override. virtual void update(float /*delta_time*/) {} // Caixa que `MovingSprite::tryMove` envia al callback de col·lisió per // decidir si el moviment és vàlid. Per defecte coincideix amb `pos_` // (el sprite sencer); les subclasses que usen falsa perspectiva (p.ex. // `Player`) la sobreescriuen amb una sub-caixa més petita (només els // peus) per a que el cap puga sobresortir sense bloquejar el // moviment. [[nodiscard]] virtual auto collisionBox() const -> SDL_FRect { return pos_; } virtual void render(); // Renderitza substituint l'índex source_color per target_color (ús típic: // la classe Text, que recolora glifs monocroms per paràmetre). virtual void render(Uint8 source_color, Uint8 target_color); virtual void clear(); [[nodiscard]] auto getX() const -> float { return pos_.x; } [[nodiscard]] auto getY() const -> float { return pos_.y; } [[nodiscard]] auto getWidth() const -> float { return pos_.w; } [[nodiscard]] auto getHeight() const -> float { return pos_.h; } [[nodiscard]] auto getPosition() const -> SDL_FRect { return pos_; } [[nodiscard]] auto getClip() const -> SDL_FRect { return clip_; } [[nodiscard]] auto getSurface() const -> std::shared_ptr { return surface_; } void setX(float x) { pos_.x = x; } void setY(float y) { pos_.y = y; } void setWidth(float w) { pos_.w = w; } void setHeight(float h) { pos_.h = h; } void setPosition(float x, float y); void setPosition(SDL_FPoint p); void setPosition(SDL_FRect r) { pos_ = r; } void setClip(SDL_FRect rect) { clip_ = rect; } void setClip(float x, float y, float w, float h) { clip_ = SDL_FRect{.x = x, .y = y, .w = w, .h = h}; } void setSurface(std::shared_ptr surface) { surface_ = std::move(surface); } protected: std::shared_ptr surface_{nullptr}; SDL_FRect pos_{.x = 0.0F, .y = 0.0F, .w = 0.0F, .h = 0.0F}; SDL_FRect clip_{.x = 0.0F, .y = 0.0F, .w = 0.0F, .h = 0.0F}; };