Files
super_pang_clone/source/bullet.cpp
2022-10-21 14:02:16 +02:00

212 lines
4.0 KiB
C++

#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;
}