#include "game/entities/bullet.h" #include "core/rendering/sprite.h" // for Sprite #include "game/defaults.hpp" // for BulletKind::NONE, PLAY_AREA_LEFT, PLAY_AREA_RIGHT, PLAY_A... class Texture; // Constructor Bullet::Bullet(int x, int y, BulletKind kind, bool poweredUp, int owner, Texture *texture, SDL_Renderer *renderer) { sprite = new Sprite({x, y, 10, 10}, texture, renderer); // Posición inicial del objeto posX = x; posY = y; // Alto y ancho del objeto width = 10; height = 10; // Velocidad inicial en el eje Y velY = -3; // Tipo de bala this->kind = kind; // Identificador del dueño del objeto this->owner = owner; // Valores especificos según el tipo switch (kind) { case BulletKind::UP: // Establece la velocidad inicial velX = 0; // Rectangulo con los gráficos del objeto if (!poweredUp) { sprite->setSpriteClip(0 * width, 0, sprite->getWidth(), sprite->getHeight()); } else { sprite->setSpriteClip((0 + 3) * width, 0, sprite->getWidth(), sprite->getHeight()); } break; case BulletKind::LEFT: // Establece la velocidad inicial velX = -2; // Rectangulo con los gráficos del objeto if (!poweredUp) { sprite->setSpriteClip(1 * width, 0, sprite->getWidth(), sprite->getHeight()); } else { sprite->setSpriteClip((1 + 3) * width, 0, sprite->getWidth(), sprite->getHeight()); } break; case BulletKind::RIGHT: // Establece la velocidad inicial velX = 2; // Rectangulo con los gráficos del objeto if (!poweredUp) { sprite->setSpriteClip(2 * width, 0, sprite->getWidth(), sprite->getHeight()); } else { sprite->setSpriteClip((2 + 3) * width, 0, sprite->getWidth(), sprite->getHeight()); } break; default: break; } // Establece el tamaño del circulo de colisión collider.r = width / 2; // Alinea el circulo de colisión con el objeto shiftColliders(); } // Destructor Bullet::~Bullet() { delete sprite; } // Pinta el objeto en pantalla void Bullet::render() { sprite->render(); } // Actualiza la posición y estado del objeto en horizontal auto Bullet::move() -> Uint8 { // Variable con el valor de retorno Uint8 msg = BULLET_MOVE_OK; // Mueve el objeto a su nueva posición posX += velX; // Si el objeto se sale del area de juego por los laterales if ((posX < PLAY_AREA_LEFT - width) || (posX > PLAY_AREA_RIGHT)) { // Se deshabilita kind = BulletKind::NONE; // Mensaje de salida msg = BULLET_MOVE_OUT; } // Mueve el objeto a su nueva posición en vertical posY += velY; // Si el objeto se sale del area de juego por la parte superior if (posY < PLAY_AREA_TOP - height) { // Se deshabilita kind = BulletKind::NONE; // Mensaje de salida msg = BULLET_MOVE_OUT; } // Actualiza la posición del sprite sprite->setPosX(posX); sprite->setPosY(posY); // Alinea el circulo de colisión con el objeto shiftColliders(); return msg; } // Comprueba si el objeto está habilitado auto Bullet::isEnabled() const -> bool { return kind != BulletKind::NONE; } // Deshabilita el objeto void Bullet::disable() { kind = BulletKind::NONE; } // Obtiene el valor de la variable auto Bullet::getPosX() const -> int { return posX; } // Obtiene el valor de la variable auto Bullet::getPosY() const -> int { return posY; } // Establece el valor de la variable void Bullet::setPosX(int x) { posX = x; } // Establece el valor de la variable void Bullet::setPosY(int y) { posY = y; } // Obtiene el valor de la variable auto Bullet::getVelY() const -> int { return velY; } // Obtiene el valor de la variable auto Bullet::getKind() const -> BulletKind { return kind; } // Obtiene el valor de la variable auto Bullet::getOwner() const -> int { return owner; } // Obtiene el circulo de colisión auto Bullet::getCollider() -> Circle & { return collider; } // Alinea el circulo de colisión con el objeto void Bullet::shiftColliders() { collider.x = posX + collider.r; collider.y = posY + collider.r; }