164 lines
3.8 KiB
C++
164 lines
3.8 KiB
C++
#include "smartsprite.h"
|
|
|
|
#include "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 las variables internas del objeto
|
|
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
|
|
bool SmartSprite::isEnabled() {
|
|
return enabled;
|
|
}
|
|
|
|
// Establece el valor de la variable
|
|
void SmartSprite::setEnabled(bool enabled) {
|
|
this->enabled = enabled;
|
|
}
|
|
|
|
// Obtiene el valor de la variable
|
|
int SmartSprite::getEnabledCounter() {
|
|
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
|
|
int SmartSprite::getDestX() {
|
|
return destX;
|
|
}
|
|
|
|
// Obtiene el valor de la variable
|
|
int SmartSprite::getDestY() {
|
|
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) ? true : false;
|
|
|
|
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
|
|
bool SmartSprite::isOnDestination() {
|
|
return onDestination;
|
|
}
|
|
|
|
// Obtiene el valor de la variable
|
|
bool SmartSprite::hasFinished() {
|
|
return finished;
|
|
} |