#include "bullet.h" // Constructor Bullet::Bullet(SDL_Renderer *gRenderer) { this->gRenderer = gRenderer; gBulletTexture = new LTexture(gRenderer); // Carga los gráficos de las balas if (!gBulletTexture->loadFromFile("media/gfx/bullet.png")) { printf("Failed to load bullet texture!\n"); } init(0, 0, NO_KIND); } // Destructor Bullet::~Bullet() { gBulletTexture->free(); } // Iniciador void Bullet::init(int x, int y, int kind) { // Posición inicial del objeto mPosX = x; mPosY = y; // Alto y ancho del objeto mWidth = 8; mHeight = mWidth; // Velocidad inicial en el eje Y mVelY = -3; // Tipo de bala mKind = kind; // Textura con los gráficos del objeto mSprite.setTexture(*gBulletTexture); // Alto y ancho del sprite mSprite.setWidth(mWidth); mSprite.setHeight(mHeight); // Posición inicial del sprite mSprite.setPosX(mPosX); mSprite.setPosY(mPosY); // Valores especificos según el tipo switch (kind) { case BULLET_UP: // Establece la velocidad inicial mVelX = 0; // Rectangulo con los gráficos del objeto mSprite.setSpriteClip(0 * mWidth, 0, mSprite.getWidth(), mSprite.getHeight()); break; case BULLET_LEFT: // Establece la velocidad inicial mVelX = -2; // Rectangulo con los gráficos del objeto mSprite.setSpriteClip(1 * mWidth, 0, mSprite.getWidth(), mSprite.getHeight()); break; case BULLET_RIGHT: // Establece la velocidad inicial mVelX = 2; // Rectangulo con los gráficos del objeto mSprite.setSpriteClip(2 * mWidth, 0, mSprite.getWidth(), mSprite.getHeight()); break; default: // Establece la velocidad inicial mVelX = 0; // Rectangulo con los gráficos del objeto mSprite.setSpriteClip(0 * mWidth, 0, mSprite.getWidth(), mSprite.getHeight()); break; } // Establece el tamaño del circulo de colisión mCollider.r = mWidth / 2; // Alinea el circulo de colisión con el objeto shiftColliders(); } // Pinta el objeto en pantalla void Bullet::render() { mSprite.render(); } // Actualiza la posición y estado del objeto en horizontal void Bullet::move() { // Mueve el objeto a su nueva posición mPosX += mVelX; // Si el objeto se sale del area de juego por los laterales if ((mPosX < PLAY_AREA_LEFT) || (mPosX + mWidth > PLAY_AREA_RIGHT)) { // Se deshabilita mKind = NO_KIND; } // Mueve el objeto a su nueva posición en vertical mPosY += int(mVelY); // Si el objeto se sale del area de juego por la parte superior o inferior if ((mPosY < PLAY_AREA_TOP) || (mPosY + mHeight > PLAY_AREA_BOTTOM)) { // Se deshabilita mKind = NO_KIND; } // Actualiza la posición del sprite mSprite.setPosX(mPosX); mSprite.setPosY(mPosY); // Alinea el circulo de colisión con el objeto shiftColliders(); } #ifdef TEST void Bullet::testMove() { // Update sprite position mSprite.setPosX(mPosX); mSprite.setPosY(mPosY); // Update circle colliders shiftColliders(); } #endif // Deshabilita el objeto void Bullet::erase() { mKind = NO_KIND; } // Comprueba si el objeto está activo bool Bullet::isActive() { if (mKind == NO_KIND) { return false; } else { return true; } } // Obtiene el valor de la variable int Bullet::getPosX() { return mPosX; } // Obtiene el valor de la variable int Bullet::getPosY() { return mPosY; } // Establece el valor de la variable void Bullet::setPosX(int x) { mPosX = x; } // Establece el valor de la variable void Bullet::setPosY(int y) { mPosY = y; } // Obtiene el valor de la variable float Bullet::getVelY() { return mVelY; } // Obtiene el valor de la variable int Bullet::getKind() { return mKind; } // Obtiene el circulo de colisión Circle &Bullet::getCollider() { return mCollider; } // Alinea el circulo de colisión con el objeto void Bullet::shiftColliders() { mCollider.x = mPosX + mCollider.r; mCollider.y = mPosY + mCollider.r; }