diff --git a/.gitignore b/.gitignore index 40f304c..24b0bd7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ +build/ + # ---> C++ # Prerequisites *.d @@ -39,7 +41,8 @@ .LSOverride # Icon must end with two \r -Icon +Icon + # Thumbnails ._* diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..5e938a8 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,55 @@ +cmake_minimum_required(VERSION 3.20) +project(demo3_pixels_bouncing) + +# Establecer el estándar de C++ +set(CMAKE_CXX_STANDARD 20) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +# Opciones comunes de compilación +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Os") + +# Buscar SDL3 automáticamente +find_package(SDL3 REQUIRED) + +# Si no se encuentra SDL3, generar un error +if (NOT SDL3_FOUND) + message(FATAL_ERROR "SDL3 no encontrado. Por favor, verifica su instalación.") +endif() + +# Archivos fuente +file(GLOB SOURCE_FILES source/*.cpp) + +# Comprobar si se encontraron archivos fuente +if(NOT SOURCE_FILES) + message(FATAL_ERROR "No se encontraron archivos fuente en el directorio 'source/'. Verifica la ruta.") +endif() + +# Nombre del ejecutable +set(EXECUTABLE_NAME demo3_pixels_bouncing) + +# Detectar la plataforma y configuraciones específicas +if(WIN32) + set(PLATFORM windows) + set(LINK_LIBS ${SDL3_LIBRARIES} mingw32 ws2_32) + set(EXECUTABLE_EXTENSION ".exe") +elseif(UNIX AND NOT APPLE) + set(PLATFORM linux) + set(LINK_LIBS ${SDL3_LIBRARIES}) + set(EXECUTABLE_EXTENSION ".out") +elseif(APPLE) + set(PLATFORM macos) + set(LINK_LIBS ${SDL3_LIBRARIES}) + set(EXECUTABLE_EXTENSION ".out") +endif() + +# Incluir directorios de SDL3 +include_directories(${SDL3_INCLUDE_DIRS}) + +# Añadir el ejecutable +add_executable(${EXECUTABLE_NAME}${EXECUTABLE_EXTENSION} ${SOURCE_FILES}) + +# Especificar la ubicación del ejecutable (en la raíz del proyecto) +set_target_properties(${EXECUTABLE_NAME}${EXECUTABLE_EXTENSION} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}) + +# Enlazar las bibliotecas necesarias +target_link_libraries(${EXECUTABLE_NAME}${EXECUTABLE_EXTENSION} ${LINK_LIBS}) diff --git a/source/defines.h b/source/defines.h index 77fc669..96afd03 100644 --- a/source/defines.h +++ b/source/defines.h @@ -10,7 +10,8 @@ constexpr int ZOOM = 3; constexpr float GRAVITY = 0.2f; constexpr int DOT_SIZE = 1; constexpr int MAX_DOTS = 200000; -constexpr int TEXT_TIME = 100; +constexpr Uint64 TEXT_DURATION = 2000; +constexpr Uint64 DEMO_SPEED = 1000/60; struct Color { diff --git a/source/main.cpp b/source/main.cpp index f889b1f..1e2d788 100644 --- a/source/main.cpp +++ b/source/main.cpp @@ -5,236 +5,247 @@ #include #include -SDL_Window *window = NULL; -SDL_Renderer *renderer = NULL; +// Ventana y renderizador +SDL_Window *window = nullptr; +SDL_Renderer *renderer = nullptr; + +// Datos de los puntos y su representación gráfica Dot::DotData dots[MAX_DOTS]; SDL_FPoint dot_points[MAX_DOTS]; + +// Escenarios y configuración int test[8] = {1, 10, 100, 500, 1000, 10000, 50000, MAX_DOTS}; int scenario = 0; std::string text = ""; int text_pos = 0; bool show_text = true; -int counter = 0; +Uint64 text_init_time; bool should_exit = false; -Uint32 ticks = 0; +Uint64 ticks = 0; +// Actualiza el texto a mostrar en pantalla void setText() { - const std::string text2 = test[scenario] == 1 ? " PIXEL" : " PIXELS"; - text = std::to_string(test[scenario]) + text2; - const int size = text.size() * 8; - text_pos = WIDTH / 2 - size / 2; - counter = TEXT_TIME; - show_text = true; + const std::string text2 = test[scenario] == 1 ? " PIXEL" : " PIXELES"; + text = std::to_string(test[scenario]) + text2; + const int size = text.size() * 8; + text_pos = WIDTH / 2 - size / 2; + text_init_time = SDL_GetTicks(); + show_text = true; } +// Inicializa los puntos para el escenario actual void initDots() { - for (int i = 0; i < test[scenario]; ++i) - { - const int sign = ((rand() % 2) * 2) - 1; - const float x = (rand() % (WIDTH / 2)) + (WIDTH / 4); - const float vx = (((rand() % 20) + 10) * 0.1f) * sign; - const float vy = ((rand() % 60) - 30) * 0.1f; - const Color color = {(rand() % 192) + 32, (rand() % 192) + 32, (rand() % 192) + 32}; - dots[i] = Dot::ini(x, vx, vy, color); - } - setText(); + for (int i = 0; i < test[scenario]; ++i) + { + const int sign = ((rand() % 2) * 2) - 1; + const float x = (rand() % (WIDTH / 2)) + (WIDTH / 4); + const float vx = (((rand() % 20) + 10) * 0.1f) * sign; + const float vy = ((rand() % 60) - 30) * 0.1f; + const Color color = {(rand() % 192) + 32, (rand() % 192) + 32, (rand() % 192) + 32}; + dots[i] = Dot::ini(x, vx, vy, color); + } + setText(); } +// Empuja los puntos hacia arriba con una fuerza aleatoria void pushUpDots() { - for (int i = 0; i < test[scenario]; ++i) - { - const int sign = ((rand() % 2) * 2) - 1; - const float vx = (((rand() % 20) + 10) * 0.1f) * sign; - const float vy = ((rand() % 40) * 0.1f) + 5; - Dot::modVel(dots[i], vx, -vy); - } + for (int i = 0; i < test[scenario]; ++i) + { + const int sign = ((rand() % 2) * 2) - 1; + const float vx = (((rand() % 20) + 10) * 0.1f) * sign; + const float vy = ((rand() % 40) * 0.1f) + 5; + Dot::modVel(dots[i], vx, -vy); + } } +// Inicializa SDL y configura la ventana y el renderizador bool init() { - // Initialization flag - bool success = true; + bool success = true; - // Initialize SDL - if (!SDL_Init(SDL_INIT_VIDEO)) - { - printf("SDL could not initialize! SDL Error: %s\n", SDL_GetError()); - success = false; - } - else - { - // Create window - window = SDL_CreateWindow(WINDOW_CAPTION, WIDTH * ZOOM, HEIGHT * ZOOM, SDL_WINDOW_OPENGL); - if (window == nullptr) - { - printf("Window could not be created! SDL Error: %s\n", SDL_GetError()); - success = false; - } - else - { - // Create renderer for window - renderer = SDL_CreateRenderer(window, nullptr); - if (renderer == nullptr) - { - printf("Renderer could not be created! SDL Error: %s\n", SDL_GetError()); - success = false; - } - else - { - // Initialize renderer color - SDL_SetRenderDrawColor(renderer, 0xFF, 0xFF, 0xFF, 0xFF); + // Inicializar SDL + if (!SDL_Init(SDL_INIT_VIDEO)) + { + std::cout << "¡SDL no se pudo inicializar! Error de SDL: " << SDL_GetError() << std::endl; + success = false; + } + else + { + // Crear ventana + window = SDL_CreateWindow(WINDOW_CAPTION, WIDTH * ZOOM, HEIGHT * ZOOM, SDL_WINDOW_OPENGL); + if (window == nullptr) + { + std::cout << "¡No se pudo crear la ventana! Error de SDL: " << SDL_GetError() << std::endl; + success = false; + } + else + { + // Crear renderizador + renderer = SDL_CreateRenderer(window, nullptr); + if (renderer == nullptr) + { + std::cout << "¡No se pudo crear el renderizador! Error de SDL: " << SDL_GetError() << std::endl; + success = false; + } + else + { + // Inicializar el color del renderizador + SDL_SetRenderDrawColor(renderer, 0xFF, 0xFF, 0xFF, 0xFF); - // Establece el tamaño del renderizador - SDL_SetRenderLogicalPresentation(renderer, WIDTH, HEIGHT, SDL_LOGICAL_PRESENTATION_INTEGER_SCALE); - } - } - } + // Establecer el tamaño lógico del renderizador + SDL_SetRenderLogicalPresentation(renderer, WIDTH, HEIGHT, SDL_LOGICAL_PRESENTATION_INTEGER_SCALE); + } + } + } - ticks = SDL_GetTicks(); - srand(time(nullptr)); - dbg_init(renderer); - initDots(); - setText(); + ticks = SDL_GetTicks(); + srand(time(nullptr)); + dbg_init(renderer); + initDots(); + setText(); - return success; + return success; } +// Libera los recursos y cierra SDL void close() { - // Destroy window - SDL_DestroyRenderer(renderer); - SDL_DestroyWindow(window); + SDL_DestroyRenderer(renderer); + SDL_DestroyWindow(window); - // Quit SDL subsystems - SDL_Quit(); + // Finalizar SDL + SDL_Quit(); } +// Maneja los eventos del teclado y del sistema void checkEvents() { - SDL_Event event; - // Comprueba los eventos que hay en la cola - while (SDL_PollEvent(&event) != 0) - { - // Evento de salida de la aplicación - if (event.type == SDL_EVENT_QUIT) - { - should_exit = true; - break; - } + SDL_Event event; + while (SDL_PollEvent(&event) != 0) + { + // Evento de salida + if (event.type == SDL_EVENT_QUIT) + { + should_exit = true; + break; + } - if (event.type == SDL_EVENT_KEY_DOWN && event.key.repeat == 0) - { - switch (event.key.key) - { - case SDLK_ESCAPE: - should_exit = true; - break; + // Eventos de teclado + if (event.type == SDL_EVENT_KEY_DOWN && event.key.repeat == 0) + { + switch (event.key.key) + { + case SDLK_ESCAPE: + should_exit = true; + break; - case SDLK_SPACE: - pushUpDots(); - break; + case SDLK_SPACE: + pushUpDots(); + break; - case SDLK_1: - scenario = 0; - initDots(); - break; + case SDLK_1: + scenario = 0; + initDots(); + break; - case SDLK_2: - scenario = 1; - initDots(); - break; + case SDLK_2: + scenario = 1; + initDots(); + break; - case SDLK_3: - scenario = 2; - initDots(); - break; + case SDLK_3: + scenario = 2; + initDots(); + break; - case SDLK_4: - scenario = 3; - initDots(); - break; + case SDLK_4: + scenario = 3; + initDots(); + break; - case SDLK_5: - scenario = 4; - initDots(); - break; + case SDLK_5: + scenario = 4; + initDots(); + break; - case SDLK_6: - scenario = 5; - initDots(); - break; + case SDLK_6: + scenario = 5; + initDots(); + break; - case SDLK_7: - scenario = 6; - initDots(); - break; + case SDLK_7: + scenario = 6; + initDots(); + break; - case SDLK_8: - scenario = 7; - initDots(); - break; + case SDLK_8: + scenario = 7; + initDots(); + break; - default: - break; - } - } - } + default: + break; + } + } + } } +// Actualiza la posición de los puntos y gestiona el temporizador del texto void update() { - if (SDL_GetTicks() - ticks > 15) - { - ticks = SDL_GetTicks(); + if (SDL_GetTicks() - ticks > DEMO_SPEED) + { + ticks = SDL_GetTicks(); - for (int i = 0; i < test[scenario]; ++i) - { - dot_points[i] = Dot::update(dots[i]); - } + for (int i = 0; i < test[scenario]; ++i) + { + dot_points[i] = Dot::update(dots[i]); + } - if (counter > 0) - { - counter--; - } - else - { - show_text = false; - } - } + if (show_text) + { + show_text = !(SDL_GetTicks() - text_init_time > TEXT_DURATION); + } + } } +// Renderiza el contenido en la pantalla void render() { - SDL_SetRenderDrawColor(renderer, 32, 32, 32, 255); - SDL_RenderClear(renderer); + SDL_SetRenderDrawColor(renderer, 32, 32, 32, 255); + SDL_RenderClear(renderer); - SDL_SetRenderDrawColor(renderer, 224, 224, 224, 255); - SDL_RenderPoints(renderer, dot_points, test[scenario]); + SDL_SetRenderDrawColor(renderer, 224, 224, 224, 255); + SDL_RenderPoints(renderer, dot_points, test[scenario]); - if (show_text) - { - dbg_print(text_pos, 8, text.c_str(), 255, 32, 32); - } + if (show_text) + { + dbg_print(text_pos, 8, text.c_str(), 255, 32, 32); + } - SDL_RenderPresent(renderer); + SDL_RenderPresent(renderer); } +// Función principal int main(int argc, char *args[]) { - init(); + if (!init()) + { + return -1; + } - while (!should_exit) - { - update(); - checkEvents(); - render(); - } + while (!should_exit) + { + update(); + checkEvents(); + render(); + } - close(); + close(); - return 0; -} \ No newline at end of file + return 0; +}