#include "core/rendering/smartsprite.h" #include "core/rendering/movingsprite.h" // for MovingSprite class Texture; // Constructor SmartSprite::SmartSprite(Texture *texture, SDL_Renderer *renderer) { // Copia punteros setTexture(texture); setRenderer(renderer); // Inicializa el objeto init(); } // Inicializa el objeto void SmartSprite::init() { enabled = false; enabledCounter = 0; onDestination = false; destX = 0; destY = 0; counter = 0; finished = false; } // Actualiza la posición y comprueba si ha llegado a su destino void SmartSprite::update() { if (enabled) { // Actualiza només la posició; els SmartSprite no usen animació de // frames i salten deliberadament AnimatedSprite::animate(). // NOLINTNEXTLINE(bugprone-parent-virtual-call) MovingSprite::update(); // Comprueba el movimiento checkMove(); // Comprueba si ha terminado checkFinished(); } } // Pinta el objeto en pantalla void SmartSprite::render() { if (enabled) { // Muestra el sprite por pantalla MovingSprite::render(); } } // Obtiene el valor de la variable auto SmartSprite::getEnabledCounter() const -> int { return enabledCounter; } // Establece el valor de la variable void SmartSprite::setEnabledCounter(int value) { enabledCounter = value; } // Establece el valor de la variable void SmartSprite::setDestX(int x) { destX = x; } // Establece el valor de la variable void SmartSprite::setDestY(int y) { destY = y; } // Obtiene el valor de la variable auto SmartSprite::getDestX() const -> int { return destX; } // Obtiene el valor de la variable auto SmartSprite::getDestY() const -> int { return destY; } // Comprueba el movimiento void SmartSprite::checkMove() { // Comprueba si se desplaza en el eje X hacia la derecha if (getAccelX() > 0 || getVelX() > 0) { // Comprueba si ha llegado al destino if (getPosX() > destX) { // Lo coloca en posición setPosX(destX); // Lo detiene setVelX(0.0F); setAccelX(0.0F); } } // Comprueba si se desplaza en el eje X hacia la izquierda else if (getAccelX() < 0 || getVelX() < 0) { // Comprueba si ha llegado al destino if (getPosX() < destX) { // Lo coloca en posición setPosX(destX); // Lo detiene setVelX(0.0F); setAccelX(0.0F); } } // Comprueba si se desplaza en el eje Y hacia abajo if (getAccelY() > 0 || getVelY() > 0) { // Comprueba si ha llegado al destino if (getPosY() > destY) { // Lo coloca en posición setPosY(destY); // Lo detiene setVelY(0.0F); setAccelY(0.0F); } } // Comprueba si se desplaza en el eje Y hacia arriba else if (getAccelY() < 0 || getVelY() < 0) { // Comprueba si ha llegado al destino if (getPosY() < destY) { // Lo coloca en posición setPosY(destY); // Lo detiene setVelY(0.0F); setAccelY(0.0F); } } } // Comprueba si ha terminado void SmartSprite::checkFinished() { // Comprueba si ha llegado a su destino onDestination = getPosX() == destX && getPosY() == destY; if (onDestination) { // Si esta en el destino comprueba su contador if (enabledCounter == 0) { // Si ha llegado a cero, deshabilita el objeto y lo marca como finalizado finished = true; } else { // Si no ha llegado a cero, decrementa el contador enabledCounter--; } } } // Obtiene el valor de la variable auto SmartSprite::isOnDestination() const -> bool { return onDestination; } // Obtiene el valor de la variable auto SmartSprite::hasFinished() const -> bool { return finished; }