#include "moving_sprite.h" #include // Para max #include "texture.h" // Para Texture // Constructor MovingSprite::MovingSprite(std::shared_ptr texture, SDL_Rect pos, Rotate rotate, float zoom_w, float zoom_h, SDL_RendererFlip flip) : Sprite(texture, pos), x_(pos.x), y_(pos.y), rotate_(rotate), zoom_w_(zoom_w), zoom_h_(zoom_h), flip_(flip) {} MovingSprite::MovingSprite(std::shared_ptr texture, SDL_Rect pos) : Sprite(texture, pos), x_(pos.x), y_(pos.y), rotate_(Rotate()), zoom_w_(1.0f), zoom_h_(1.0f), flip_(SDL_FLIP_NONE) {} MovingSprite::MovingSprite(std::shared_ptr texture) : Sprite(texture), x_(0.0f), y_(0.0f), rotate_(Rotate()), zoom_w_(1.0f), zoom_h_(1.0f), flip_(SDL_FLIP_NONE) { Sprite::clear(); } // Reinicia todas las variables void MovingSprite::clear() { x_ = 0.0f; // Posición en el eje X y_ = 0.0f; // Posición en el eje Y vx_ = 0.0f; // Velocidad en el eje X. Cantidad de pixeles a desplazarse vy_ = 0.0f; // Velocidad en el eje Y. Cantidad de pixeles a desplazarse ax_ = 0.0f; // Aceleración en el eje X. Variación de la velocidad ay_ = 0.0f; // Aceleración en el eje Y. Variación de la velocidad rotate_ = Rotate(); // Inicializa la estructura zoom_w_ = 1.0f; // Zoom aplicado a la anchura zoom_h_ = 1.0f; // Zoom aplicado a la altura flip_ = SDL_FLIP_NONE; // Establece como se ha de voltear el sprite Sprite::clear(); } // Mueve el sprite void MovingSprite::move() { x_ += vx_; y_ += vy_; vx_ += ax_; vy_ += ay_; pos_.x = static_cast(x_); pos_.y = static_cast(y_); } // Actualiza las variables internas del objeto void MovingSprite::update() { move(); rotate(); } // Muestra el sprite por pantalla void MovingSprite::render() { texture_->render(pos_.x, pos_.y, &sprite_clip_, zoom_w_, zoom_h_, rotate_.angle, rotate_.center, flip_); } // Establece el valor de la variable void MovingSprite::setZoomW(float value) { zoom_w_ = value; } // Establece el valor de la variable void MovingSprite::setZoomH(float value) { zoom_h_ = value; } // Establece el valor de la variable void MovingSprite::setAngle(double value) { rotate_.angle = value; } // Establece el valor de la variable void MovingSprite::setRotatingCenter(SDL_Point *point) { rotate_.center = point; } // Incrementa el valor del ángulo void MovingSprite::updateAngle() { rotate_.angle += rotate_.amount; } // Obtiene el valor de la variable bool MovingSprite::isRotating() const { return rotate_.enabled; } // Establece la rotacion void MovingSprite::rotate() { if (rotate_.enabled) { ++rotate_.counter; if (rotate_.counter % rotate_.speed == 0) { updateAngle(); rotate_.counter = 0; } } } // Activa o desactiva el efecto de rotación void MovingSprite::setRotate(bool enable) { rotate_.enabled = enable; rotate_.counter = 0; } // Establece el valor de la variable void MovingSprite::setRotateSpeed(int value) { rotate_.speed = std::max(1, value); } // Establece el valor de la variable void MovingSprite::setRotateAmount(double value) { rotate_.amount = value; } // Cambia el sentido de la rotación void MovingSprite::switchRotate() { rotate_.amount *= -1; } // Establece el valor de la variable void MovingSprite::setFlip(SDL_RendererFlip flip) { flip_ = flip; } // Gira el sprite horizontalmente void MovingSprite::flip() { flip_ = (flip_ == SDL_FLIP_HORIZONTAL) ? SDL_FLIP_NONE : SDL_FLIP_HORIZONTAL; } // Obtiene el valor de la variable SDL_RendererFlip MovingSprite::getFlip() { return flip_; } // Establece la posición y_ el tamaño del objeto void MovingSprite::setPos(SDL_Rect rect) { x_ = static_cast(rect.x); y_ = static_cast(rect.y); pos_ = rect; } // Establece el valor de las variables void MovingSprite::setPos(float x, float y) { x_ = x; y_ = y; pos_.x = static_cast(x_); pos_.y = static_cast(y_); } // Establece el valor de la variable void MovingSprite::setPosX(float value) { x_ = value; pos_.x = static_cast(x_); } // Establece el valor de la variable void MovingSprite::setPosY(float value) { y_ = value; pos_.y = static_cast(y_); } // Establece el valor de la variable void MovingSprite::setVelX(float value) { vx_ = value; } // Establece el valor de la variable void MovingSprite::setVelY(float value) { vy_ = value; } // Establece el valor de la variable void MovingSprite::setAccelX(float value) { ax_ = value; } // Establece el valor de la variable void MovingSprite::setAccelY(float value) { ay_ = value; }