#pragma once #include // para Uint8, Uint16, Uint32 #include // para shared_ptr, unique_ptr #include // para string #include // para vector #include "animated_sprite.h" // para SpriteAnimated #include "utils.h" // para Circle class Texture; // Cantidad de elementos del vector con los valores de la deformación del globo al rebotar constexpr int MAX_BOUNCE = 10; // Tipos de globo constexpr int BALLOON_1 = 1; constexpr int BALLOON_2 = 2; constexpr int BALLOON_3 = 3; constexpr int BALLOON_4 = 4; constexpr int HEXAGON_1 = 5; constexpr int HEXAGON_2 = 6; constexpr int HEXAGON_3 = 7; constexpr int HEXAGON_4 = 8; constexpr int POWER_BALL = 9; // Puntos de globo constexpr int BALLOON_SCORE_1 = 50; constexpr int BALLOON_SCORE_2 = 100; constexpr int BALLOON_SCORE_3 = 200; constexpr int BALLOON_SCORE_4 = 400; // Tamaños de globo constexpr int BALLOON_SIZE_1 = 1; constexpr int BALLOON_SIZE_2 = 2; constexpr int BALLOON_SIZE_3 = 3; constexpr int BALLOON_SIZE_4 = 4; // Clases de globo constexpr int BALLOON_CLASS = 0; constexpr int HEXAGON_CLASS = 1; // Velocidad del globo constexpr float BALLOON_VELX_POSITIVE = 0.7f; constexpr float BALLOON_VELX_NEGATIVE = -0.7f; // Indice para las animaciones de los globos constexpr int BALLOON_MOVING_ANIMATION = 0; constexpr int BALLOON_POP_ANIMATION = 1; constexpr int BALLOON_BORN_ANIMATION = 2; // Velocidades a las que se mueven los globos constexpr float BALLOON_SPEED_1 = 0.60f; constexpr float BALLOON_SPEED_2 = 0.70f; constexpr float BALLOON_SPEED_3 = 0.80f; constexpr float BALLOON_SPEED_4 = 0.90f; constexpr float BALLOON_SPEED_5 = 1.00f; // Tamaño de los globos constexpr int BALLOON_WIDTH_1 = 10; constexpr int BALLOON_WIDTH_2 = 16; constexpr int BALLOON_WIDTH_3 = 26; constexpr int BALLOON_WIDTH_4 = 46; // PowerBall constexpr int POWERBALL_SCREENPOWER_MINIMUM = 10; constexpr int POWERBALL_COUNTER = 8; // Clase Balloon class Balloon { private: // Estructura para las variables para el efecto de los rebotes struct Bouncing { bool enabled; // Si el efecto está activo Uint8 counter; // Countador para el efecto Uint8 speed; // Velocidad a la que transcurre el efecto float zoomW; // Zoom aplicado a la anchura float zoomH; // Zoom aplicado a la altura float despX; // Desplazamiento de pixeles en el eje X antes de pintar el objeto con zoom float despY; // Desplazamiento de pixeles en el eje Y antes de pintar el objeto con zoom std::vector w; // Vector con los valores de zoom para el ancho del globo std::vector h; // Vector con los valores de zoom para el alto del globo }; // Objetos y punteros std::unique_ptr sprite_; // Sprite del objeto globo // Variables float pos_x_; // Posición en el eje X float pos_y_; // Posición en el eje Y Uint8 width_; // Ancho Uint8 height_; // Alto float vel_x_; // Velocidad en el eje X. Cantidad de pixeles a desplazarse float vel_y_; // Velocidad en el eje Y. Cantidad de pixeles a desplazarse float gravity_; // Aceleración en el eje Y. Modifica la velocidad float default_vel_y_; // Velocidad inicial que tienen al rebotar contra el suelo float max_vel_y_; // Máxima velocidad que puede alcanzar el objeto en el eje Y bool being_created_; // Indica si el globo se está creando bool blinking_ = false; // Indica si el globo está intermitente bool enabled_ = true; // Indica si el globo esta activo bool invulnerable_; // Indica si el globo es invulnerable bool stopped_ = true; // Indica si el globo está parado bool visible_ = true; // Indica si el globo es visible Circle collider_; // Circulo de colisión del objeto Uint16 creation_counter_; // Temporizador para controlar el estado "creandose" Uint16 creation_counter_ini_; // Valor inicial para el temporizador para controlar el estado "creandose" Uint16 score_; // Puntos que da el globo al ser destruido Uint16 stopped_counter_ = 0; // Contador para controlar el estado "parado" Uint8 kind_; // Tipo de globo Uint8 menace_; // Cantidad de amenaza que genera el globo Uint32 counter_ = 0; // Contador interno float travel_y_ = 1.0f; // Distancia que ha de recorrer el globo en el eje Y antes de que se le aplique la gravedad float speed_; // Velocidad a la que se mueven los globos Uint8 size_; // Tamaño del globo Uint8 power_; // Cantidad de poder que alberga el globo Bouncing bouncing_; // Contiene las variables para el efecto de rebote // Alinea el circulo de colisión con la posición del objeto globo void updateColliders(); // Activa el efecto void bounceStart(); // Detiene el efecto void bounceStop(); // Aplica el efecto void updateBounce(); // Actualiza los estados del globo void updateState(); // Establece la animación correspondiente void updateAnimation(); // Establece el valor de la variable void setBeingCreated(bool value); public: // Constructor Balloon(float x, float y, Uint8 kind, float vel_x, float speed, Uint16 creation_timer, std::shared_ptr texture, const std::vector &animation); // Destructor ~Balloon() = default; // Centra el globo en la posición X void allignTo(int x); // Pinta el globo en la pantalla void render(); // Actualiza la posición y estados del globo void move(); // Deshabilita el globo y pone a cero todos los valores void disable(); // Explosiona el globo void pop(); // Actualiza al globo a su posicion, animación y controla los contadores void update(); // Comprueba si el globo está habilitado bool isEnabled() const; // Obtiene del valor de la variable float getPosX() const; // Obtiene del valor de la variable float getPosY() const; // Obtiene del valor de la variable float getVelY() const; // Obtiene del valor de la variable int getWidth() const; // Obtiene del valor de la variable int getHeight() const; // Establece el valor de la variable void setVelY(float vel_y); // Establece el valor de la variable void setSpeed(float speed); // Obtiene del valor de la variable int getKind() const; // Obtiene del valor de la variable Uint8 getSize() const; // Obtiene la clase a la que pertenece el globo Uint8 getClass() const; // Establece el valor de la variable void setStop(bool value); // Obtiene del valor de la variable bool isStopped() const; // Establece el valor de la variable void setBlink(bool value); // Obtiene del valor de la variable bool isBlinking() const; // Establece el valor de la variable void setVisible(bool value); // Obtiene del valor de la variable bool isVisible() const; // Establece el valor de la variable void setInvulnerable(bool value); // Obtiene del valor de la variable bool isInvulnerable() const; // Obtiene del valor de la variable bool isBeingCreated() const; // Establece el valor de la variable void setStoppedTimer(Uint16 time); // Obtiene del valor de la variable Uint16 getStoppedTimer() const; // Obtiene del valor de la variable Uint16 getScore() const; // Obtiene el circulo de colisión Circle &getCollider(); // Obtiene le valor de la variable Uint8 getMenace() const; // Obtiene le valor de la variable Uint8 getPower() const; // Indica si el globo se puede explotar bool canBePopped() const; // Indica si el globo se puede destruir bool canBeDestroyed() const; };