Files
coffee-crisis/source/core/rendering/smartsprite.cpp
T

188 lines
5.0 KiB
C++

#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;
enabled_counter_ = 0;
on_destination_ = false;
dest_x_ = 0;
dest_y_ = 0;
counter_ = 0;
finished_ = false;
}
// Actualiza la posición y comprueba si ha llegado a su destino
void SmartSprite::update() {
if (enabled_) {
// NOLINTNEXTLINE(bugprone-parent-virtual-call): salt deliberat a l'avi — SmartSprite hereta d'AnimatedSprite només per reutilitzar API, però no usa animació de frames, així que es salta AnimatedSprite::update() (que cridaria animate())
MovingSprite::update();
// Comprueba el movimiento
checkMove();
// Comprueba si ha terminado
checkFinished();
}
}
// Time-based: la velocitat i acceleració són en px/s i px/s^2; el temps de
// permanència després d'arribar al destí ve donat per setRemainingTime().
void SmartSprite::update(float dt_s) {
if (enabled_) {
// NOLINTNEXTLINE(bugprone-parent-virtual-call): vegeu update() per al motiu del salt
MovingSprite::update(dt_s);
checkMove();
checkFinishedTimeBased(dt_s);
}
}
// 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 enabled_counter_;
}
// Establece el valor de la variable
void SmartSprite::setEnabledCounter(int value) {
enabled_counter_ = value;
}
// Time-based: temps de visibilitat post-arribada
void SmartSprite::setRemainingTime(float seconds) {
remaining_time_s_ = seconds;
}
auto SmartSprite::getRemainingTime() const -> float {
return remaining_time_s_;
}
// Establece el valor de la variable
void SmartSprite::setDestX(int x) {
dest_x_ = x;
}
// Establece el valor de la variable
void SmartSprite::setDestY(int y) {
dest_y_ = y;
}
// Obtiene el valor de la variable
auto SmartSprite::getDestX() const -> int {
return dest_x_;
}
// Obtiene el valor de la variable
auto SmartSprite::getDestY() const -> int {
return dest_y_;
}
// 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() > dest_x_) {
// Lo coloca en posición
setPosX(dest_x_);
// 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() < dest_x_) {
// Lo coloca en posición
setPosX(dest_x_);
// 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() > dest_y_) {
// Lo coloca en posición
setPosY(dest_y_);
// 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() < dest_y_) {
// Lo coloca en posición
setPosY(dest_y_);
// Lo detiene
setVelY(0.0F);
setAccelY(0.0F);
}
}
}
// Comprueba si ha terminado
void SmartSprite::checkFinished() {
// Comprueba si ha llegado a su destino
on_destination_ = getPosX() == dest_x_ && getPosY() == dest_y_;
if (on_destination_) { // Si esta en el destino comprueba su contador
if (enabled_counter_ == 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
enabled_counter_--;
}
}
}
// Time-based: decrementa el temps restant cada crida si està al destí
void SmartSprite::checkFinishedTimeBased(float dt_s) {
on_destination_ = getPosX() == dest_x_ && getPosY() == dest_y_;
if (on_destination_) {
if (remaining_time_s_ <= 0.0F) {
finished_ = true;
} else {
remaining_time_s_ -= dt_s;
}
}
}
// Obtiene el valor de la variable
auto SmartSprite::isOnDestination() const -> bool {
return on_destination_;
}
// Obtiene el valor de la variable
auto SmartSprite::hasFinished() const -> bool {
return finished_;
}