#include "bullet.h" #include "const.h" // for NO_KIND, PLAY_AREA_LEFT, PLAY_AREA_RIGHT, PLAY_A... #include "sprite.h" // for Sprite class Texture; // Constructor Bullet::Bullet(int x, int y, int 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 BULLET_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 BULLET_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 BULLET_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 Uint8 Bullet::move() { // 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 = NO_KIND; // Mensaje de salida msg = BULLET_MOVE_OUT; } // Mueve el objeto a su nueva posición en vertical posY += int(velY); // Si el objeto se sale del area de juego por la parte superior if (posY < PLAY_AREA_TOP - height) { // Se deshabilita kind = NO_KIND; // 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 bool Bullet::isEnabled() { if (kind == NO_KIND) { return false; } else { return true; } } // Deshabilita el objeto void Bullet::disable() { kind = NO_KIND; } // Obtiene el valor de la variable int Bullet::getPosX() { return posX; } // Obtiene el valor de la variable int Bullet::getPosY() { 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 int Bullet::getVelY() { return velY; } // Obtiene el valor de la variable int Bullet::getKind() { return kind; } // Obtiene el valor de la variable int Bullet::getOwner() { return owner; } // Obtiene el circulo de colisión circle_t &Bullet::getCollider() { return collider; } // Alinea el circulo de colisión con el objeto void Bullet::shiftColliders() { collider.x = posX + collider.r; collider.y = posY + collider.r; }