#include "balloon.h" // Constructor Balloon::Balloon(SDL_Renderer *gRenderer) { this->gRenderer = gRenderer; gBalloonTexture = new LTexture(gRenderer); // Carga los gráficos de los globos if (!gBalloonTexture->loadFromFile("media/gfx/balloon.png")) { printf("Failed to load balloon texture!\n"); } init(0, 0, NO_KIND, BALLON_VELX_POSITIVE, 0); } // Destructor Balloon::~Balloon() { gBalloonTexture->free(); } // Inicializador void Balloon::init(int x, int y, Uint8 kind, float velx, Uint16 creationtimer) { switch (kind) { case BALLOON_1: // Posición inicial mPosX = x; mPosY = y; // Alto y ancho del objeto mWidth = 8; mHeight = mWidth; // Inicializa los valores de velocidad y gravedad mVelX = velx; mVelY = 0; mMaxVelY = 3; mGravity = 0.09; mDefaultVelY = 3; // Puntos que da el globo al ser destruido mScore = 50; // Rectangulo con la imagen del sprite mSprite.setSpriteClip(37 + 21 + 13, 0, mWidth, mHeight); break; case BALLOON_2: // Posición inicial mPosX = x; mPosY = y; // Alto y ancho del objeto mWidth = 13; mHeight = mWidth; // Inicializa los valores de velocidad y gravedad mVelX = velx; mVelY = 0; mMaxVelY = 3; mGravity = 0.10; mDefaultVelY = 4; // Puntos que da el globo al ser destruido mScore = 100; // Rectangulo con la imagen del sprite mSprite.setSpriteClip(37 + 21, 0, mWidth, mHeight); break; case BALLOON_3: // Posición inicial mPosX = x; mPosY = y; // Alto y ancho del objeto mWidth = 21; mHeight = mWidth; // Inicializa los valores de velocidad y gravedad mVelX = velx; mVelY = 0; mMaxVelY = 3; mGravity = 0.10; mDefaultVelY = 4.5; // Puntos que da el globo al ser destruido mScore = 200; // Rectangulo con la imagen del sprite mSprite.setSpriteClip(37, 0, mWidth, mHeight); break; case BALLOON_4: // Posición inicial mPosX = x; mPosY = y; // Alto y ancho del objeto mWidth = 37; mHeight = mWidth; // Inicializa los valores de velocidad y gravedad mVelX = velx; mVelY = 0; mMaxVelY = 3; mGravity = 0.10; mDefaultVelY = 5; // Puntos que da el globo al ser destruido mScore = 400; // Rectangulo con la imagen del sprite mSprite.setSpriteClip(0, 0, mWidth, mHeight); break; default: // Posición inicial mPosX = x; mPosY = y; // Alto y ancho del objeto mWidth = 0; mHeight = mWidth; // Inicializa los valores de velocidad y gravedad mVelX = velx; mVelY = 0; mMaxVelY = 0; mGravity = 0; mDefaultVelY = 0; // Puntos que da el globo al ser destruido mScore = 0; // Rectangulo con la imagen del sprite mSprite.setSpriteClip(0, 0, mWidth, mHeight); break; } // Textura con los gráficos del sprite mSprite.setTexture(*gBalloonTexture); // Alto y ancho del sprite mSprite.setWidth(mWidth); mSprite.setHeight(mHeight); // Posición X,Y del sprite mSprite.setPosX(mPosX); mSprite.setPosY(mPosY); // Tamaño del circulo de colisión mCollider.r = mWidth / 2; // Alinea el circulo de colisión con el objeto shiftColliders(); // Inicializa variables mStopped = true; mStoppedTimer = 0; mBlinking = false; mVisible = true; mInvulnerable = false; mBeingCreated = true; mCreationTimer = creationtimer; // Tipo mKind = kind; } // Centra el globo en la posición X void Balloon::allignTo(int x) { mPosX = x - (mWidth / 2); if (mPosX < PLAY_AREA_LEFT) { mPosX = PLAY_AREA_LEFT + 1; } else if ((mPosX + mWidth) > PLAY_AREA_RIGHT) { mPosX = PLAY_AREA_RIGHT - mWidth - 1; } // Posición X,Y del sprite mSprite.setPosX(getPosX()); mSprite.setPosY(getPosY()); // Alinea el circulo de colisión con el objeto shiftColliders(); } // Pinta el globo en la pantalla void Balloon::render() { if (mVisible) { mSprite.render(); } } // Actualiza la posición y estados del globo void Balloon::move() { // Comprobamos si se puede mover if (isStopped() == false) { // Lo movemos a izquierda o derecha mPosX += mVelX; // Si queda fuera de pantalla, corregimos su posición y cambiamos su sentido if ((mPosX < PLAY_AREA_LEFT) || (mPosX + mWidth > PLAY_AREA_RIGHT)) { // Corregir posición mPosX -= mVelX; // Invertir sentido mVelX = -mVelX; } // Mueve el globo hacia arriba o hacia abajo mPosY += int(mVelY); // Si se sale por arriba if (mPosY < PLAY_AREA_TOP) { // Corregimos mPosY -= int(mVelY); // Invertimos sentido mVelY = -mVelY; } // Si el globo se sale por la parte inferior if (mPosY + mHeight > PLAY_AREA_BOTTOM) { // Corregimos mPosY -= int(mVelY); // Invertimos colocando una velocidad por defecto mVelY = -mDefaultVelY; } // Aplica gravedad al objeto, sin pasarse de un limite establecido if (int(mVelY) > mMaxVelY) { mVelY = mMaxVelY; } else { mVelY += mGravity; } // Actualiza la posición del sprite mSprite.setPosX(getPosX()); mSprite.setPosY(mPosY); // Actualiza la posición del circulo de colisión shiftColliders(); } // Si no se puede mover: // Comprobar si se está creando else if (isBeingCreated() == true) { // Actualiza el valor de las variables setStop(true); setInvulnerable(true); // Todavia tiene tiempo en el contador if (mCreationTimer > 0) { // Desplaza lentamente el globo hacia abajo y hacia un lado if (mCreationTimer % 10 == 0) { ++mPosY; mPosX += mVelX; // Actualiza la posición del sprite mSprite.setPosX(getPosX()); mSprite.setPosY(mPosY); // Actualiza la posición del circulo de colisión shiftColliders(); } // Hace visible el globo de forma intermitente if (mCreationTimer > 100) { setVisible(mCreationTimer / 10 % 2 == 0); } else { setVisible(mCreationTimer / 5 % 2 == 0); } --mCreationTimer; } // El contador ha llegado a cero else { setBeingCreated(false); setStop(false); setVisible(true); setInvulnerable(false); } } // Comprobar si está detenido else if (isStopped() == true) { // Si todavía está detenido, reduce el contador if (mStoppedTimer > 0) { --mStoppedTimer; } // Si el contador ha llegado a cero, ya no está detenido else { setStop(false); } } } // Pone a cero todos los valores del globo void Balloon::erase() { init(0, 0, NO_KIND, 0, 0); } // Comprueba si el globo tiene algun tipo asignado bool Balloon::isActive() { if (mKind == NO_KIND) { return false; } else { return true; } } // Obtiene del valor de la variable int Balloon::getPosX() { return int(mPosX); } // Obtiene del valor de la variable int Balloon::getPosY() { return mPosY; } // Obtiene del valor de la variable float Balloon::getVelY() { return mVelY; } // Obtiene del valor de la variable int Balloon::getWidth() { return mWidth; } // Obtiene del valor de la variable int Balloon::getHeight() { return mHeight; } // Establece el valor de la variable void Balloon::setVelY(float velY) { mVelY = velY; } // Obtiene del valor de la variable int Balloon::getKind() { return mKind; } // Establece el valor de la variable void Balloon::setStop(bool state) { mStopped = state; } // Obtiene del valor de la variable bool Balloon::isStopped() { return mStopped; } // Establece el valor de la variable void Balloon::setBlink(bool state) { mBlinking = state; } // Obtiene del valor de la variable bool Balloon::isBlinking() { return mBlinking; } // Establece el valor de la variable void Balloon::setVisible(bool state) { mVisible = state; } // Obtiene del valor de la variable bool Balloon::isVisible() { return mVisible; } // Establece el valor de la variable void Balloon::setInvulnerable(bool state) { mInvulnerable = state; } // Obtiene del valor de la variable bool Balloon::isInvulnerable() { return mInvulnerable; } // Establece el valor de la variable void Balloon::setBeingCreated(bool state) { mBeingCreated = state; } // Obtiene del valor de la variable bool Balloon::isBeingCreated() { return mBeingCreated; } // Establece el valor de la variable void Balloon::setStoppedTimer(Uint16 time) { mStoppedTimer = time; } // Obtiene del valor de la variable Uint16 Balloon::getStoppedTimer() { return mStoppedTimer; } // Obtiene del valor de la variable Uint16 Balloon::getScore() { return mScore; } // Obtiene el circulo de colisión Circle &Balloon::getCollider() { return mCollider; } // Alinea el circulo de colisión con la posición del objeto globo void Balloon::shiftColliders() { // Align collider to center of balloon mCollider.x = mPosX + mCollider.r; mCollider.y = mPosY + mCollider.r; }