#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 "player.h" // Para Player::Id #include "resource.h" // Para Resource // Constructor Bullet::Bullet(float x, float y, Type type, Color color, int owner) : sprite_(std::make_unique(Resource::get()->getTexture("bullet.png"), Resource::get()->getAnimation("bullet.ani"))), type_(type), owner_(owner), pos_x_(x), pos_y_(y) { vel_x_ = calculateVelocity(type_); sprite_->setCurrentAnimation(buildAnimationString(type_, color)); collider_.r = WIDTH / 2; shiftColliders(); } // Calcula la velocidad horizontal de la bala basada en su tipo auto Bullet::calculateVelocity(Type type) -> float { switch (type) { case Type::LEFT: return VEL_X_LEFT; case Type::RIGHT: return VEL_X_RIGHT; default: return VEL_X_CENTER; } } // Construye el string de animación basado en el tipo de bala y si está potenciada auto Bullet::buildAnimationString(Type type, Color color) -> std::string { std::string animation_string = color == Color::GREEN ? "powered_" : "normal_"; switch (type) { case Type::UP: animation_string += "up"; break; case Type::LEFT: animation_string += "left"; break; case Type::RIGHT: animation_string += "right"; break; default: break; } return animation_string; } // Implementación de render void Bullet::render() { if (type_ != Type::NONE) { sprite_->render(); } } // Actualiza el estado del objeto auto Bullet::update(float deltaTime) -> MoveStatus { sprite_->update(deltaTime); return move(deltaTime); } // Implementación del movimiento usando MoveStatus auto Bullet::move(float deltaTime) -> MoveStatus { pos_x_ += vel_x_ * deltaTime; if (pos_x_ < param.game.play_area.rect.x - WIDTH || pos_x_ > param.game.play_area.rect.w) { disable(); return MoveStatus::OUT; } pos_y_ += VEL_Y * deltaTime; if (pos_y_ < param.game.play_area.rect.y - HEIGHT) { disable(); return MoveStatus::OUT; } shiftSprite(); shiftColliders(); return MoveStatus::OK; } auto Bullet::isEnabled() const -> bool { return type_ != Type::NONE; } void Bullet::disable() { type_ = Type::NONE; } auto Bullet::getOwner() const -> int { return owner_; } auto Bullet::getCollider() -> Circle& { 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_); }