Player: si tires a jugar desde el estat WAITING passes al ENTERING_SCREEN i despres sempre tens inmunitat, fins i tot la primera volta (al començar el joc) falta: arregñar el z-order per al estat WAITING
96 lines
4.7 KiB
C++
96 lines
4.7 KiB
C++
#pragma once
|
|
|
|
#include <SDL3/SDL.h> // Para SDL_FlipMode, SDL_FPoint, SDL_FRect
|
|
|
|
#include <algorithm> // Para max
|
|
#include <memory> // Para shared_ptr
|
|
|
|
#include "sprite.h" // Para Sprite
|
|
|
|
class Texture;
|
|
|
|
// Clase MovingSprite. Añade movimiento y efectos de rotación, zoom y flip al sprite
|
|
class MovingSprite : public Sprite {
|
|
public:
|
|
// --- Estructura para la rotación ---
|
|
struct Rotate {
|
|
bool enabled{false}; // Indica si ha de rotar
|
|
int counter{0}; // Contador
|
|
int speed{1}; // Velocidad de giro
|
|
double angle{0.0}; // Ángulo para dibujarlo
|
|
float amount{0.0F}; // Cantidad de grados a girar en cada iteración
|
|
SDL_FPoint center; // Centro de rotación
|
|
|
|
Rotate() : center({0.0F, 0.0F}) {}
|
|
};
|
|
|
|
// --- Constructores y destructor ---
|
|
MovingSprite(std::shared_ptr<Texture> texture, SDL_FRect pos, MovingSprite::Rotate rotate, float zoom_w, float zoom_h, SDL_FlipMode flip);
|
|
MovingSprite(std::shared_ptr<Texture> texture, SDL_FRect pos);
|
|
explicit MovingSprite(std::shared_ptr<Texture> texture);
|
|
~MovingSprite() override = default;
|
|
|
|
// --- Métodos principales ---
|
|
virtual void update(); // Actualiza las variables internas del objeto
|
|
void clear() override; // Reinicia todas las variables a cero
|
|
void stop(); // Elimina el movimiento del sprite
|
|
void render() override; // Muestra el sprite por pantalla
|
|
|
|
// --- Getters de posición y movimiento ---
|
|
[[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_; }
|
|
|
|
// --- Setters de movimiento ---
|
|
void setVelX(float value) { vx_ = value; }
|
|
void setVelY(float value) { vy_ = value; }
|
|
void setAccelX(float value) { ax_ = value; }
|
|
void setAccelY(float value) { ay_ = value; }
|
|
|
|
// --- Rotación ---
|
|
[[nodiscard]] auto isRotating() const -> bool { return rotate_.enabled; }
|
|
void setHorizontalZoom(float value) { horizontal_zoom_ = value; }
|
|
void setVerticalZoom(float value) { vertical_zoom_ = value; }
|
|
void setAngle(double value) { rotate_.angle = value; }
|
|
void setRotatingCenter(SDL_FPoint point) { rotate_.center = point; }
|
|
void setRotate(bool enable); // Activa o desactiva el efecto de rotación
|
|
void setRotateSpeed(int value) { rotate_.speed = std::max(1, value); }
|
|
void setRotateAmount(double value) { rotate_.amount = value; }
|
|
void switchRotate() { rotate_.amount *= -1; } // Cambia el sentido de la rotación
|
|
|
|
// --- Flip ---
|
|
void setFlip(SDL_FlipMode flip) { flip_ = flip; }
|
|
void flip() { flip_ = (flip_ == SDL_FLIP_HORIZONTAL) ? SDL_FLIP_NONE : SDL_FLIP_HORIZONTAL; }
|
|
auto getFlip() -> SDL_FlipMode { return flip_; }
|
|
|
|
// --- Posición y tamaño ---
|
|
void setPos(SDL_FRect rect); // Establece la posición y el tamaño del objeto
|
|
void setPos(float pos_x, float pos_y); // Establece la posición del objeto
|
|
void setPosX(float pos_x); // Establece la posición X
|
|
void setPosY(float pos_y); // Establece la posición Y
|
|
|
|
protected:
|
|
// --- Variables de posición y movimiento ---
|
|
float x_ = 0.0F; // Posición en el eje X
|
|
float y_ = 0.0F; // Posición en el eje Y
|
|
|
|
float vx_ = 0.0F; // Velocidad en el eje X. Cantidad de píxeles a desplazarse
|
|
float vy_ = 0.0F; // Velocidad en el eje Y. Cantidad de píxeles a desplazarse
|
|
|
|
float ax_ = 0.0F; // Aceleración en el eje X. Variación de la velocidad
|
|
float ay_ = 0.0F; // Aceleración en el eje Y. Variación de la velocidad
|
|
|
|
// --- Efectos visuales ---
|
|
Rotate rotate_; // Variables usadas para controlar la rotación del sprite
|
|
float horizontal_zoom_; // Zoom aplicado a la anchura
|
|
float vertical_zoom_; // Zoom aplicado a la altura
|
|
SDL_FlipMode flip_; // Indica cómo se voltea el sprite
|
|
|
|
// --- Métodos internos ---
|
|
void updateAngle() { rotate_.angle += rotate_.amount; } // Incrementa el valor del ángulo
|
|
void move(); // Mueve el sprite según velocidad y aceleración
|
|
void rotate(); // Rota el sprite según los parámetros de rotación
|
|
}; |