diff --git a/data/title/title_loading.gif b/data/title/title_loading.gif index 313452a..f0aa075 100644 Binary files a/data/title/title_loading.gif and b/data/title/title_loading.gif differ diff --git a/source/paleta.cpp b/source/paleta.cpp deleted file mode 100644 index a692b44..0000000 --- a/source/paleta.cpp +++ /dev/null @@ -1,218 +0,0 @@ -#include "paleta.h" -#include // Para SDL_PIXELFORMAT_ARGB8888 -#include // Para SDL_Rect -#include // Para SEEK_END, SEEK_SET -#include // Para NULL, fseek, fclose, fopen, fread, ftell -#include // Para malloc, free -#include "gif.h" // Para LoadGif, LoadPalette - -struct jSurface_s -{ - Uint8 *data; - Uint16 w, h; -}; - -static SDL_Texture *jTex = NULL; -static jSurface jScreen; -static jSurface jDestSurf; -static jSurface jSourceSurf = NULL; -static Uint32 paleta[256]; -static int jWidth = 256; -static int jHeight = 128; -static int transparentColor = 255; - -void pInit(SDL_Renderer *renderer, int w, int h) -{ - jWidth = w; - jHeight = h; - jTex = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, w, h); - jScreen = pNewSurface(w, h); - jDestSurf = jScreen; -} - -jSurface pNewSurface(int w, int h) -{ - jSurface surf = (jSurface)malloc(sizeof(jSurface_s)); - surf->w = w; - surf->h = h; - surf->data = (Uint8 *)malloc(w * h); - return surf; -} - -void pDeleteSurface(jSurface surf) -{ - if (surf == NULL) - return; - if (surf->data != NULL) - free(surf->data); - free(surf); -} - -void pSetDest(jSurface surf) -{ - if (surf == NULL) - jDestSurf = jScreen; - else - jDestSurf = surf; -} - -void pSetSource(jSurface surf) -{ - jSourceSurf = surf; -} - -void pBlit(int dx, int dy, int sx, int sy, int w, int h) -{ - if (jSourceSurf == NULL) - return; - - for (int iy = 0; iy < h; ++iy) - { - for (int ix = 0; ix < w; ++ix) - pPutPixel(dx + ix, dy + iy, pGetPixel(sx + ix, sy + iy)); - } -} - -jSurface pLoadSurface(const char *filename) -{ - FILE *f = fopen(filename, "rb"); - if (!f) - return NULL; - - fseek(f, 0, SEEK_END); - long size = ftell(f); - fseek(f, 0, SEEK_SET); - - Uint8 *buffer = (Uint8 *)malloc(size); - if (!buffer) // Verificar que la memoria se asignó correctamente - { - fclose(f); - return NULL; - } - - // Verificar el retorno de fread - if (fread(buffer, size, 1, f) != 1) - { - free(buffer); // Liberar memoria si falla la lectura - fclose(f); - return NULL; - } - - fclose(f); - - Uint16 w, h; - Uint8 *pixels = LoadGif(buffer, &w, &h); - free(buffer); // Liberar memoria después de usar el buffer - - if (pixels == NULL) - { - return NULL; - } - - jSurface surf = (jSurface)malloc(sizeof(jSurface_s)); - if (!surf) // Verificar que la memoria se asignó correctamente - { - free(pixels); // Liberar los píxeles si falla - return NULL; - } - - surf->w = w; - surf->h = h; - surf->data = pixels; - - return surf; -} - -void pLoadPal(const char *filename) -{ - FILE *f = fopen(filename, "rb"); - if (!f) - return; - - fseek(f, 0, SEEK_END); - long size = ftell(f); - fseek(f, 0, SEEK_SET); - Uint8 *buffer = (Uint8 *)malloc(size); - if (!buffer) // Verificar que la asignación de memoria fue exitosa - { - fclose(f); - return; - } - - // Verificar el resultado de fread - if (fread(buffer, size, 1, f) != 1) - { - free(buffer); // Liberar memoria si falla la lectura - fclose(f); - return; - } - - fclose(f); - - Uint32 *pal = LoadPalette(buffer); - free(buffer); // Liberar memoria después de usar el buffer - - if (pal == NULL) - { - return; - } - - for (int i = 0; i < 256; ++i) - { - paleta[i] = pal[i]; - } -} - -void pSetPal(int index, Uint32 color) -{ - paleta[index] = color; -} - -void pCls(Uint8 color) -{ - for (int i = 0; i < jDestSurf->w * jDestSurf->h; ++i) - jDestSurf->data[i] = color; -} - -void pFlip(SDL_Renderer *renderer) -{ - Uint32 *pixels; - int pitch; - SDL_LockTexture(jTex, NULL, (void **)&pixels, &pitch); - for (int i = 0; i < jWidth * jHeight; ++i) - pixels[i] = paleta[jScreen->data[i]]; - SDL_UnlockTexture(jTex); - SDL_Rect rect = {0, 64, 256, 128}; - SDL_RenderCopy(renderer, jTex, NULL, &rect); -} - -void pPutPixel(int x, int y, Uint8 color) -{ - if (x < 0 || y < 0 || x >= jDestSurf->w || y >= jDestSurf->h || color == transparentColor) - return; - jDestSurf->data[x + y * jDestSurf->w] = color; -} - -Uint8 pGetPixel(int x, int y) -{ - return jSourceSurf->data[x + y * jSourceSurf->w]; -} - -bool pFadePal() -{ - // Colores pares - for (int i = 18; i > 0; i = i - 2) - { - paleta[i] = paleta[i - 2]; - } - - // Colores impares - for (int i = 17; i > 1; i = i - 2) - { - paleta[i] = paleta[i - 2]; - } - - paleta[1] = paleta[0]; - - return paleta[15] == paleta[0] ? true : false; -} \ No newline at end of file diff --git a/source/paleta.h b/source/paleta.h deleted file mode 100644 index d263afb..0000000 --- a/source/paleta.h +++ /dev/null @@ -1,29 +0,0 @@ -#pragma once - -#include // Para SDL_Renderer -#include // Para Uint8, Uint32 - -typedef struct jSurface_s *jSurface; - -jSurface pNewSurface(int w, int h); -void pDeleteSurface(jSurface surf); -void pSetDest(jSurface surf); -void pSetSource(jSurface surf); - -jSurface pLoadSurface(const char *filename); - -void pPutPixel(int x, int y, Uint8 color); -Uint8 pGetPixel(int x, int y); - -void pBlit(int dx, int dy, int sx, int sy, int w, int h); - -void pInit(SDL_Renderer *renderer, int w, int h); - -void pSetPal(int index, Uint32 color); -void pLoadPal(const char *filename); - -void pCls(Uint8 color); - -void pFlip(SDL_Renderer *renderer); - -bool pFadePal(); diff --git a/source/surface.cpp b/source/surface.cpp index 80a8563..8c04242 100644 --- a/source/surface.cpp +++ b/source/surface.cpp @@ -55,7 +55,7 @@ Palette loadPalette(const std::string &file_path) } // Carga una paleta desde un archivo .pal -Palette readPalFile(const std::string& file_path) +Palette readPalFile(const std::string &file_path) { Palette palette{}; palette.fill(0); // Inicializar todo con 0 (transparente por defecto) @@ -101,7 +101,6 @@ Palette readPalFile(const std::string& file_path) return palette; } - // Constructor Surface::Surface(int w, int h) : surface_data_(std::make_shared(w, h)), @@ -186,10 +185,7 @@ void Surface::putPixel(int x, int y, Uint8 color) } // Obtiene el color de un pixel de la surface_data -Uint8 Surface::getPixel(int x, int y) -{ - return surface_data_->data[x + y * surface_data_->width]; -} +Uint8 Surface::getPixel(int x, int y) { return surface_data_->data[x + y * surface_data_->width]; } // Dibuja un rectangulo relleno void Surface::fillRect(SDL_Rect *rect, Uint8 color) @@ -320,7 +316,7 @@ void Surface::render(int dx, int dy, int sx, int sy, int w, int h) void Surface::render(int x, int y, SDL_Rect *srcRect, SDL_RendererFlip flip) { - auto surface_data = Screen::get()->getRendererSurface()->getSurfaceData(); + auto surface_data_dest = Screen::get()->getRendererSurface()->getSurfaceData(); // Determina la región de origen (clip) a renderizar int sx = (srcRect) ? srcRect->x : 0; @@ -331,12 +327,12 @@ void Surface::render(int x, int y, SDL_Rect *srcRect, SDL_RendererFlip flip) // Limitar la región para evitar accesos fuera de rango en origen w = std::min(w, surface_data_->width - sx); h = std::min(h, surface_data_->height - sy); - w = std::min(w, surface_data->width - x); - h = std::min(h, surface_data->height - y); + w = std::min(w, surface_data_dest->width - x); + h = std::min(h, surface_data_dest->height - y); // Limitar la región para evitar accesos fuera de rango en destino - w = std::min(w, surface_data->width - x); - h = std::min(h, surface_data->height - y); + w = std::min(w, surface_data_dest->width - x); + h = std::min(h, surface_data_dest->height - y); // Renderiza píxel por píxel aplicando el flip si es necesario for (int iy = 0; iy < h; ++iy) @@ -352,13 +348,13 @@ void Surface::render(int x, int y, SDL_Rect *srcRect, SDL_RendererFlip flip) int dest_y = y + iy; // Verificar que las coordenadas de destino están dentro de los límites - if (dest_x >= 0 && dest_x < surface_data->width && dest_y >= 0 && dest_y < surface_data->height) + if (dest_x >= 0 && dest_x < surface_data_dest->width && dest_y >= 0 && dest_y < surface_data_dest->height) { // Copia el píxel si no es transparente Uint8 color = surface_data_->data[src_x + src_y * surface_data_->width]; if (color != transparent_color_) { - surface_data->data[dest_x + dest_y * surface_data->width] = color; + surface_data_dest->data[dest_x + dest_y * surface_data_dest->width] = color; } } } diff --git a/source/title.cpp b/source/title.cpp index 0e5fd7e..64b040d 100644 --- a/source/title.cpp +++ b/source/title.cpp @@ -19,20 +19,15 @@ #include "text.h" // for Text, TEXT_CENTER, TEXT_COLOR #include "surface.h" // for Surface #include "utils.h" // for Color, stringToColor, Palette -#include "paleta.h" // Constructor Title::Title() : title_logo_surface_(Resource::get()->getSurface("title_logo.gif")), title_logo_sprite_(std::make_shared(title_logo_surface_, 0, 0, title_logo_surface_->getWidth(), title_logo_surface_->getHeight())), + loading_screen_surface_(Resource::get()->getSurface("title_loading.gif")), + loading_screen_sprite_(std::make_shared(loading_screen_surface_, 0, options.game.height - loading_screen_surface_->getHeight(), loading_screen_surface_->getWidth(), loading_screen_surface_->getHeight())), bg_surface_(std::make_shared(options.game.width, options.game.height)) { - // Carga la surface con los gráficos de la pantalla de carga - pInit(Screen::get()->getRenderer(), 256, 128); - loading_screen_ = pLoadSurface(Asset::get()->get("loading_screen_color.gif").c_str()); - pLoadPal(Asset::get()->get("loading_screen_color.gif").c_str()); - pSetSource(loading_screen_); - // Inicializa variables state_ = options.section.subsection == Subsection::TITLE_WITH_LOADING_SCREEN ? TitleState::SHOW_LOADING_SCREEN : TitleState::SHOW_MENU; options.section.section = Section::TITLE; @@ -52,12 +47,6 @@ Title::Title() playMusic("title.ogg"); } -// Destructor -Title::~Title() -{ - pDeleteSurface(loading_screen_); -} - // Inicializa la marquesina void Title::initMarquee() { @@ -164,7 +153,7 @@ void Title::updateMarquee() // Comprueba si ha terminado la marquesina y la reinicia if (letters_[letters_.size() - 1].x < -10) - { + { // Inicializa la marquesina initMarquee(); } @@ -213,7 +202,7 @@ void Title::update() case TitleState::FADE_LOADING_SCREEN: if (counter_ % 4 == 0) { - if (pFadePal()) + if (true) // poner aqui la condicion de "fin de fade = true" { counter_ = 0; state_ = TitleState::SHOW_MENU; @@ -267,12 +256,7 @@ void Title::render() case TitleState::SHOW_LOADING_SCREEN: case TitleState::FADE_LOADING_SCREEN: - // Dibuja la pantalla de carga - pCls(4); - pBlit(0, 0, 0, 0, 256, 128); - pFlip(Screen::get()->getRenderer()); - - // Dibuja el logo del título + loading_screen_sprite_->render(); title_logo_sprite_->render(); break; diff --git a/source/title.h b/source/title.h index d88e336..eabb8f5 100644 --- a/source/title.h +++ b/source/title.h @@ -6,7 +6,6 @@ #include // for shared_ptr #include // for string #include // for vector -#include "paleta.h" // for jSurface class SSprite; // lines 13-13 class Surface; // lines 15-15 @@ -28,11 +27,13 @@ private: }; // Objetos y punteros - std::shared_ptr title_logo_surface_; // Textura con los graficos - std::shared_ptr title_logo_sprite_; // SSprite para manejar la surface - std::shared_ptr bg_surface_; // Textura para dibujar el fondo de la pantalla - std::shared_ptr cheevos_surface_; // Textura con la lista de logros - std::shared_ptr cheevos_sprite_; // SSprite para manejar la surface con la lista de logros + std::shared_ptr title_logo_surface_; // Textura con los graficos + std::shared_ptr title_logo_sprite_; // SSprite para manejar la surface + std::shared_ptr loading_screen_surface_; // Surface con los gráficos de la pantalla de carga + std::shared_ptr loading_screen_sprite_; // SSprite con los gráficos de la pantalla de carga + std::shared_ptr bg_surface_; // Textura para dibujar el fondo de la pantalla + std::shared_ptr cheevos_surface_; // Textura con la lista de logros + std::shared_ptr cheevos_sprite_; // SSprite para manejar la surface con la lista de logros // Variables int counter_ = 0; // Contador @@ -43,7 +44,6 @@ private: bool show_cheevos_ = false; // Indica si se muestra por pantalla el listado de logros SDL_Rect cheevos_surface_view_; // Zona visible de la surface con el listado de logros TitleState state_; // Estado en el que se encuentra el bucle principal - jSurface loading_screen_; // Surface con los gráficos de la pantalla de carga // Actualiza las variables void update(); @@ -83,7 +83,7 @@ public: Title(); // Destructor - ~Title(); + ~Title() = default; // Bucle principal void run();