#include "bullet.h" #include // para unique_ptr, make_unique, shared_ptr #include "param.h" // para param #include "sprite.h" // para Sprite class Texture; // Constructor Bullet::Bullet(int x, int y, BulletType bullet_type, bool powered_up, int owner, std::shared_ptr texture) : sprite_(std::make_unique(texture, SDL_Rect{x, y, BULLET_WIDTH_, BULLET_HEIGHT_})), pos_x_(x), pos_y_(y), bullet_type_(bullet_type), owner_(owner) { vel_x_ = (bullet_type_ == BulletType::LEFT) ? BULLET_VEL_X_LEFT_ : (bullet_type_ == BulletType::RIGHT) ? BULLET_VEL_X_RIGHT_ : 0; int sprite_offset = powered_up ? 3 : 0; int offset = (static_cast(bullet_type) + sprite_offset) * BULLET_WIDTH_; sprite_->setSpriteClip(offset, 0, BULLET_WIDTH_, BULLET_HEIGHT_); collider_.r = BULLET_WIDTH_ / 2; shiftColliders(); } // Implementación de render (llama al render del sprite_) void Bullet::render() { sprite_->render(); } // Implementación del movimiento usando BulletMoveStatus BulletMoveStatus Bullet::move() { pos_x_ += vel_x_; if (pos_x_ < param.game.play_area.rect.x - BULLET_WIDTH_ || pos_x_ > param.game.play_area.rect.w) { disable(); return BulletMoveStatus::OUT; } pos_y_ += BULLET_VEL_Y_; if (pos_y_ < param.game.play_area.rect.y - BULLET_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_); }