#include "bullet.h" #include // Para allocator, unique_ptr, make_unique #include // 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(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_); }