diff --git a/source/ball.cpp b/source/ball.cpp index 86ad0b6..53072e4 100644 --- a/source/ball.cpp +++ b/source/ball.cpp @@ -1,16 +1,16 @@ #include "ball.h" -#include // for rand -#include // for fabs -#include "defines.h" // for BALL_SIZE, Color, SCREEN_HEIGHT, GRAVITY_FORCE +#include // for rand +#include // for fabs +#include "defines.h" // for BALL_SIZE, Color, SCREEN_HEIGHT, GRAVITY_FORCE class Texture; // Constructor Ball::Ball(float x, float vx, float vy, Color color, std::shared_ptr texture) + : sprite_(std::make_unique(texture)), + pos_({x, 0.0f, BALL_SIZE, BALL_SIZE}) { - pos_ = {x, 0.0f, BALL_SIZE, BALL_SIZE}; vx_ = vx; vy_ = vy; - sprite_ = std::make_unique(texture); sprite_->setPos({pos_.x, pos_.y}); sprite_->setSize(BALL_SIZE, BALL_SIZE); sprite_->setClip({0, 0, BALL_SIZE, BALL_SIZE}); diff --git a/source/texture.cpp b/source/texture.cpp index 3fc0332..9f3fde0 100644 --- a/source/texture.cpp +++ b/source/texture.cpp @@ -1,125 +1,128 @@ #define STB_IMAGE_IMPLEMENTATION #include "texture.h" -#include // for SDL_GetError -#include // for SDL_Log -#include // for SDL_PixelFormat -#include // for SDL_CreateSurfaceFrom, SDL_DestroySurface -#include // for NULL -#include // for exit -#include // for basic_ostream, char_traits, operator<< -#include // for operator<<, string -#include "stb_image.h" // for stbi_failure_reason, stbi_image_free +#include // Para SDL_GetError +#include // Para SDL_Log +#include // Para SDL_PixelFormat +#include // Para SDL_CreateSurfaceFrom, SDL_DestroySurface +#include // Para NULL +#include // Para exit +#include // Para basic_ostream, char_traits, operator<< +#include // Para operator<<, string +#include "stb_image.h" // Para stbi_failure_reason, stbi_image_free Texture::Texture(SDL_Renderer *renderer) - : renderer_(renderer), texture_(nullptr), width_(0), height_(0) {} + : renderer_(renderer), texture_(nullptr), width_(0), height_(0) {} -Texture::Texture(SDL_Renderer *renderer, std::string file_path) - : renderer_(renderer), texture_(nullptr), width_(0), height_(0) +Texture::Texture(SDL_Renderer *renderer, const std::string &file_path) + : renderer_(renderer), texture_(nullptr), width_(0), height_(0) { - loadFromFile(file_path); + loadFromFile(file_path); } Texture::~Texture() { - free(); + free(); } -bool Texture::loadFromFile(std::string file_path) +// Carga la imagen desde una ruta especificada +bool Texture::loadFromFile(const std::string &file_path) { - const std::string filename = file_path.substr(file_path.find_last_of("\\/") + 1); - int req_format = STBI_rgb_alpha; - int width, height, orig_format; - unsigned char *data = stbi_load(file_path.c_str(), &width, &height, &orig_format, req_format); - if (data == nullptr) - { - SDL_Log("Loading image failed: %s", stbi_failure_reason()); - exit(1); - } - else - { - std::cout << "Image loaded: " << filename.c_str() << std::endl; - } + const std::string filename = file_path.substr(file_path.find_last_of("\\/") + 1); + int req_format = STBI_rgb_alpha; + int width, height, orig_format; + unsigned char *data = stbi_load(file_path.c_str(), &width, &height, &orig_format, req_format); + if (data == nullptr) + { + SDL_Log("Error al cargar la imagen: %s", stbi_failure_reason()); + exit(1); + } + else + { + std::cout << "Imagen cargada: " << filename.c_str() << std::endl; + } - int pitch; - SDL_PixelFormat pixel_format; - if (req_format == STBI_rgb) - { - pitch = 3 * width; // 3 bytes por pixel * pixels por linea - pixel_format = SDL_PIXELFORMAT_RGB24; - } - else - { // STBI_rgb_alpha (RGBA) - pitch = 4 * width; - pixel_format = SDL_PIXELFORMAT_RGBA32; - } + int pitch; + SDL_PixelFormat pixel_format; + if (req_format == STBI_rgb) + { + pitch = 3 * width; // 3 bytes por pixel * pixels por línea + pixel_format = SDL_PIXELFORMAT_RGB24; + } + else + { // STBI_rgb_alpha (RGBA) + pitch = 4 * width; + pixel_format = SDL_PIXELFORMAT_RGBA32; + } - // Limpia - free(); + // Libera la memoria previa + free(); - // La textura final - SDL_Texture *new_texture = nullptr; + // La textura final + SDL_Texture *new_texture = nullptr; - // Carga la imagen desde una ruta específica - SDL_Surface *loaded_surface = SDL_CreateSurfaceFrom(width, height, pixel_format, (void *)data, pitch); - if (loaded_surface == nullptr) - { - std::cout << "Unable to load image " << file_path << std::endl; - } - else - { - // Crea la textura desde los pixels de la surface - new_texture = SDL_CreateTextureFromSurface(renderer_, loaded_surface); - if (new_texture == nullptr) - { - std::cout << "Unable to create texture from " << file_path << "! SDL Error: " << SDL_GetError() << std::endl; - } - else - { - // Obtiene las dimensiones de la imagen - width_ = loaded_surface->w; - height_ = loaded_surface->h; - } + // Crea la superficie de la imagen desde los datos cargados + SDL_Surface *loaded_surface = SDL_CreateSurfaceFrom(width, height, pixel_format, (void *)data, pitch); + if (loaded_surface == nullptr) + { + std::cout << "No se pudo cargar la imagen " << file_path << std::endl; + } + else + { + // Crea la textura desde los píxeles de la superficie + new_texture = SDL_CreateTextureFromSurface(renderer_, loaded_surface); + if (new_texture == nullptr) + { + std::cout << "No se pudo crear la textura desde " << file_path << "! Error de SDL: " << SDL_GetError() << std::endl; + } + else + { + // Obtiene las dimensiones de la imagen + width_ = loaded_surface->w; + height_ = loaded_surface->h; + } - // Elimina la textura cargada - SDL_DestroySurface(loaded_surface); - } + // Destruye la superficie cargada + SDL_DestroySurface(loaded_surface); + } - // Return success - stbi_image_free(data); - texture_ = new_texture; - return texture_ != nullptr; + // Devuelve el resultado del proceso + stbi_image_free(data); + texture_ = new_texture; + return texture_ != nullptr; } +// Libera la textura si existe void Texture::free() { - // Free texture if it exists - if (texture_ != NULL) - { - SDL_DestroyTexture(texture_); - texture_ = NULL; - width_ = 0; - height_ = 0; - } + if (texture_ != nullptr) + { + SDL_DestroyTexture(texture_); + texture_ = nullptr; + width_ = 0; + height_ = 0; + } } +// Renderiza la textura en pantalla void Texture::render(SDL_FRect *src, SDL_FRect *dst) { - // Render to screen - SDL_RenderTexture(renderer_, texture_, src, dst); + SDL_RenderTexture(renderer_, texture_, src, dst); } +// Obtiene el ancho de la imagen int Texture::getWidth() { - return width_; + return width_; } +// Obtiene la altura de la imagen int Texture::getHeight() { - return height_; + return height_; } -// Modulación de color +// Modula el color de la textura void Texture::setColor(int r, int g, int b) { - SDL_SetTextureColorMod(texture_, r, g, b); + SDL_SetTextureColorMod(texture_, r, g, b); } diff --git a/source/texture.h b/source/texture.h index d9f794d..f05fa1c 100644 --- a/source/texture.h +++ b/source/texture.h @@ -16,14 +16,14 @@ private: public: // Inicializa las variables - Texture(SDL_Renderer *renderer); - Texture(SDL_Renderer *renderer, std::string file_path); + explicit Texture(SDL_Renderer *renderer); + Texture(SDL_Renderer *renderer, const std::string &file_path); // Libera la memoria ~Texture(); // Carga una imagen desde la ruta especificada - bool loadFromFile(std::string path); + bool loadFromFile(const std::string &path); // Libera la textura void free();