Files
super_pang_clone/bullet.cpp
2022-10-20 13:45:49 +02:00

193 lines
3.3 KiB
C++

#include "const.h"
#include "globals.h"
#include "bullet.h"
//Constructor
Bullet::Bullet()
{
init(0, 0, NO_KIND);
}
//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:
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;
}