112 lines
2.4 KiB
C++
112 lines
2.4 KiB
C++
#include "bullet.h"
|
|
|
|
#include <memory> // Para allocator, unique_ptr, make_unique
|
|
#include <string> // Para char_traits, basic_string, operator+, string
|
|
|
|
#include "param.h" // Para Param, ParamGame, param
|
|
#include "resource.h" // Para Resource
|
|
|
|
// Constructor
|
|
Bullet::Bullet(float x, float y, BulletType bullet_type, bool powered, int owner)
|
|
: sprite_(std::make_unique<AnimatedSprite>(Resource::get()->getTexture("bullet.png"), Resource::get()->getAnimation("bullet.ani"))),
|
|
pos_x_(x),
|
|
pos_y_(y),
|
|
bullet_type_(bullet_type),
|
|
owner_(owner)
|
|
{
|
|
vel_x_ = (bullet_type_ == BulletType::LEFT) ? VEL_X_LEFT_
|
|
: (bullet_type_ == BulletType::RIGHT) ? VEL_X_RIGHT_
|
|
: 0;
|
|
|
|
std::string powered_type = powered ? "powered_" : "normal_";
|
|
switch (bullet_type)
|
|
{
|
|
case BulletType::UP:
|
|
sprite_->setCurrentAnimation(powered_type + "up");
|
|
break;
|
|
|
|
case BulletType::LEFT:
|
|
sprite_->setCurrentAnimation(powered_type + "left");
|
|
break;
|
|
|
|
case BulletType::RIGHT:
|
|
sprite_->setCurrentAnimation(powered_type + "right");
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
collider_.r = WIDTH / 2;
|
|
shiftColliders();
|
|
}
|
|
|
|
// Implementación de render (llama al render del sprite_)
|
|
void Bullet::render()
|
|
{
|
|
if (bullet_type_ != BulletType::NONE)
|
|
sprite_->render();
|
|
}
|
|
|
|
// Actualiza el estado del objeto
|
|
BulletMoveStatus Bullet::update()
|
|
{
|
|
sprite_->update();
|
|
return move();
|
|
}
|
|
|
|
// Implementación del movimiento usando BulletMoveStatus
|
|
BulletMoveStatus Bullet::move()
|
|
{
|
|
pos_x_ += vel_x_;
|
|
if (pos_x_ < param.game.play_area.rect.x - WIDTH || pos_x_ > param.game.play_area.rect.w)
|
|
{
|
|
disable();
|
|
return BulletMoveStatus::OUT;
|
|
}
|
|
|
|
pos_y_ += VEL_Y_;
|
|
if (pos_y_ < param.game.play_area.rect.y - HEIGHT)
|
|
{
|
|
disable();
|
|
return BulletMoveStatus::OUT;
|
|
}
|
|
|
|
shiftSprite();
|
|
shiftColliders();
|
|
|
|
return BulletMoveStatus::OK;
|
|
}
|
|
|
|
bool Bullet::isEnabled() const
|
|
{
|
|
return bullet_type_ != BulletType::NONE;
|
|
}
|
|
|
|
void Bullet::disable()
|
|
{
|
|
bullet_type_ = BulletType::NONE;
|
|
}
|
|
|
|
int Bullet::getOwner() const
|
|
{
|
|
return owner_;
|
|
}
|
|
|
|
Circle &Bullet::getCollider()
|
|
{
|
|
return collider_;
|
|
}
|
|
|
|
void Bullet::shiftColliders()
|
|
{
|
|
collider_.x = pos_x_ + collider_.r;
|
|
collider_.y = pos_y_ + collider_.r;
|
|
}
|
|
|
|
void Bullet::shiftSprite()
|
|
{
|
|
sprite_->setX(pos_x_);
|
|
sprite_->setY(pos_y_);
|
|
}
|