diff --git a/main.cpp b/main.cpp index fcc587d..cc0f35d 100644 --- a/main.cpp +++ b/main.cpp @@ -19,16 +19,87 @@ Código fuente creado por JailDesigner SDL_Event *event; SDL_Window *window; SDL_Renderer *renderer; +Asset *asset; +JA_Music_t *music; +JA_Sound_t *sound; +Input *input; +struct options_t *options; +Screen *screen; +Text *text; +Text *debugText; +Texture *texture; +MovingSprite *sprite; + Uint32 ticks = 0; Uint32 ticksSpeed = 15; +bool should_exit = false; int counter = 0; int gradColorMin = 64; // Minimo color más alto del degradado int gradColorMax = 192; // Minimo color más alto del degradado int gradCurrentColor = 192; // Color actual más alto del degradado int gradBreathDirection = 0; // Indica si gradCurrentColor crece o decrece -struct options_t *options; -Asset *asset; -SDL_Window *window; +string controllerName; +string inputPressed; + +// Inicializa las opciones +void initOptions(); + +// Inicializa la lista de recursos +void initAsset(char *argv[]); + +// Inicializa SDL +void initSDL(); + +// Inicializa la ventana +void initWindow(); + +// Inicializa el gestor de eventos +void initEvent(); + +// Inicializa jail_audio +void initJailAudio(); + +// Inicializa el objeto screen +void initScreen(); + +// Inicializa el objeto input +void initInput(); + +// Inicializa el texto +void initText(); + +// Inicializa el sprite +void initSprite(); + +// Inicializa todo +void initAll(char *argv[]); + +// Comprueba el teclado y los eventos +void checkEvents(); + +// Comprueba el objeto input +void checkInput(); + +// Actualiza el sprite +void updateSprite(); + +// Actualiza el degradado +void updateGradient(); + +// Actualiza la lógica del programa +void update(); + +// Dibuja un degradado de fondo +void renderGradient(); + +// Dibuja el texto +void renderText(); + +// Dibuja los elementos del programa en pantalla +void render(); + +// Libera la memoria reservada +void freeAll(); // Inicializa las opciones void initOptions() @@ -43,7 +114,7 @@ void initOptions() } // Inicializa la lista de recursos -void initAsset() +void initAsset(char *argv[]) { asset = new Asset(argv[0]); asset->add("/data/music.ogg", t_music); @@ -63,18 +134,16 @@ void initAsset() } } -int main(int argc, char *argv[]) +// Inicializa SDL +void initSDL() { - // Inicializa las opciones - initOptions(); - - // Inicializa la lista de recursos - initAsset(); - - // Inicializa SDL y la ventana SDL_Init(SDL_INIT_EVERYTHING); +} + +// Inicializa la ventana +void initWindow() +{ window = SDL_CreateWindow("Jail Engine DEMO", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, options->screen.nativeWidth * options->screen.nativeZoom * options->screen.windowZoom, options->screen.nativeHeight * options->screen.nativeZoom * options->screen.windowZoom, SDL_WINDOW_SHOWN); - // window = SDL_CreateWindow("jail_engine_demo", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 320, 240, SDL_WINDOW_SHOWN); if (window != nullptr) { renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); @@ -91,30 +160,49 @@ int main(int argc, char *argv[]) { exit(EXIT_FAILURE); } - event = new SDL_Event(); +} - // Inicializa jail_audio +// Inicializa el gestor de eventos +void initEvent() +{ + event = new SDL_Event(); +} + +// Inicializa jail_audio +void initJailAudio() +{ JA_Init(48000, AUDIO_S16, 2); - JA_Music_t *music; - JA_Sound_t *sound; music = JA_LoadMusic(asset->get("music.ogg").c_str()); sound = JA_LoadSound(asset->get("sound.wav").c_str()); + // JA_PlayMusic(music, true); +} - // Inicializa el objeto screen - Screen *screen = new Screen(window, renderer, options); +// Inicializa el objeto screen +void initScreen() +{ + screen = new Screen(window, renderer, options); screen->addNotifier(asset->get("notify.png"), asset->get("smb2.png"), asset->get("smb2.txt"), asset->get("notify.wav")); +} - // Inicializa el objeto input - Input *input = new Input(asset->get("gamecontrollerdb.txt"), options->console); - string controllerName = input->getNumControllers() > 0 ? input->getControllerName(0) : "No se ha encontrado ningun mando"; +// Inicializa el objeto input +void initInput() +{ + input = new Input(asset->get("gamecontrollerdb.txt"), options->console); + controllerName = input->getNumControllers() > 0 ? input->getControllerName(0) : "No se ha encontrado ningun mando"; +} - // Inicializa el texto - Text *text = new Text(asset->get("smb2.txt"), asset->get("smb2.png"), renderer); - Text *debugText = new Text(asset->get("debug.txt"), asset->get("debug.png"), renderer); +// Inicializa el texto +void initText() +{ + text = new Text(asset->get("smb2.txt"), asset->get("smb2.png"), renderer); + debugText = new Text(asset->get("debug.txt"), asset->get("debug.png"), renderer); +} - // Inicializa el sprite - Texture *texture = new Texture(renderer, asset->get("z80.png")); - MovingSprite *sprite = new MovingSprite(); +// Inicializa el sprite +void initSprite() +{ + texture = new Texture(renderer, asset->get("z80.png")); + sprite = new MovingSprite(); sprite->setRenderer(renderer); sprite->setTexture(texture); sprite->setPosX(140); @@ -124,202 +212,269 @@ int main(int argc, char *argv[]) sprite->setSpriteClip({0, 0, 16, 32}); sprite->setVelX(1); sprite->setVelY(2); +} - // Bucle principal - // JA_PlayMusic(music, true); - bool should_exit = false; - while (!should_exit) +// Inicializa todo +void initAll(char *argv[]) +{ + // Inicializa las opciones + initOptions(); + + // Inicializa la lista de recursos + initAsset(argv); + + // Inicializa SDL + initSDL(); + + // Inicializa la ventana + initWindow(); + + // Inicializa el gestor de eventos + initEvent(); + + // Inicializa jail_audio + initJailAudio(); + + // Inicializa el objeto screen + initScreen(); + + // Inicializa el objeto input + initInput(); + + // Inicializa el texto + initText(); + + // Inicializa el sprite + initSprite(); +} + +// Comprueba el teclado y los eventos +void checkEvents() +{ + while (SDL_PollEvent(event)) { - - // Comprueba el teclado y los eventos - while (SDL_PollEvent(event)) + if (event->type == SDL_QUIT) { - if (event->type == SDL_QUIT) + should_exit = true; + break; + } + if (event->type == SDL_KEYDOWN) + { + switch (event->key.keysym.scancode) { + + case SDL_SCANCODE_ESCAPE: should_exit = true; break; - } - if (event->type == SDL_KEYDOWN) - { - switch (event->key.keysym.scancode) - { - case SDL_SCANCODE_ESCAPE: - should_exit = true; - break; + case SDL_SCANCODE_F1: + screen->decWindowSize(); + break; - case SDL_SCANCODE_F1: - screen->decWindowSize(); - break; + case SDL_SCANCODE_F2: + screen->incWindowSize(); + break; - case SDL_SCANCODE_F2: - screen->incWindowSize(); - break; + case SDL_SCANCODE_N: + screen->showNotification("Ejemplo de notificacion", "con 2 lineas de texto", 0); + break; - case SDL_SCANCODE_N: - screen->showNotification("Ejemplo de notificacion", "con 2 lineas de texto", 0); - break; - - default: - break; - } + default: + break; } } - string inputPressed = ""; - if (input->checkInput(INPUT_LEFT)) + } +} + +// Comprueba el objeto input +void checkInput() +{ + inputPressed = ""; + if (input->checkInput(INPUT_LEFT)) + { + inputPressed = "Izquierda"; + } + if (input->checkInput(INPUT_RIGHT)) + { + inputPressed = "Derecha"; + } + if (input->checkInput(INPUT_UP)) + { + inputPressed = "Arriba"; + } + if (input->checkInput(INPUT_DOWN)) + { + inputPressed = "Abajo"; + } +} + +// Actualiza el sprite +void updateSprite() +{ + if (sprite->getPosX() + sprite->getWidth() > options->screen.nativeWidth or sprite->getPosX() < 0) + { + sprite->undoMoveX(); + int spr_direction = 1; + int spr_force = 1; + if (sprite->getVelX() > 0) { - inputPressed = "Izquierda"; + spr_direction = -1; } - if (input->checkInput(INPUT_RIGHT)) + if (SDL_GetTicks() % 2 == 0) { - inputPressed = "Derecha"; + spr_force = 2; } - if (input->checkInput(INPUT_UP)) - { - inputPressed = "Arriba"; - } - if (input->checkInput(INPUT_DOWN)) - { - inputPressed = "Abajo"; - } - - // Actualiza la lógica del programa - if (SDL_GetTicks() - ticks > ticksSpeed) - { - // Actualiza la variable - ticks = SDL_GetTicks(); - - // Incrementa el contador - counter++; - - // Actualiza el objeto screen - screen->update(); - - // Actualiza el sprite - if (sprite->getPosX() + sprite->getWidth() > options->screen.nativeWidth or sprite->getPosX() < 0) - { - sprite->undoMoveX(); - int spr_direction = 1; - int spr_force = 1; - if (sprite->getVelX() > 0) - { - spr_direction = -1; - } - if (SDL_GetTicks() % 2 == 0) - { - spr_force = 2; - } - sprite->setVelX(spr_force * spr_direction); - JA_PlaySound(sound); - } - if (sprite->getPosY() + sprite->getHeight() > options->screen.nativeHeight or sprite->getPosY() < 0) - { - sprite->undoMoveY(); - int spr_direction = 1; - int spr_force = 1; - if (sprite->getVelY() > 0) - { - spr_direction = -1; - } - if (SDL_GetTicks() % 2 == 0) - { - spr_force = 2; - } - sprite->setVelY(spr_force * spr_direction); - JA_PlaySound(sound); - } - sprite->update(); - - // Actualiza el degradado - if (counter % 1 == 0) - { - gradBreathDirection == 0 ? gradCurrentColor-- : gradCurrentColor++; - if (gradCurrentColor == gradColorMin) - { - gradBreathDirection = 1; - } - if (gradCurrentColor == gradColorMax) - { - gradBreathDirection = 0; - } - } - } - - // Dibuja en pantalla - screen->start(); - screen->clean(); - - // Dibuja un degradado de fondo - const int gradFirstLine = options->screen.nativeHeight / 3; - const int gradLastLine = options->screen.nativeHeight; - const int gradNumLines = gradLastLine - gradFirstLine; - const int gradColorFrom = 0; - - for (int i = gradFirstLine; i < gradLastLine; ++i) - { - float step = ((float)(i - gradFirstLine) / gradNumLines); - int color = gradColorFrom + ((gradCurrentColor - gradColorFrom) * step); - SDL_SetRenderDrawColor(renderer, color, 0x00, 0x00, 0xFF); - SDL_RenderDrawLine(renderer, 0, i, options->screen.nativeWidth, i); - } - - for (int i = gradLastLine; i > gradFirstLine; --i) - { - float step = ((float)(i - gradFirstLine) / gradNumLines); - int alpha = 0 + ((255 - 0) * step); - SDL_SetRenderDrawColor(renderer, 0x00, 0x00, 0xFF, alpha); - SDL_RenderDrawLine(renderer, 0, gradLastLine - i, options->screen.nativeWidth, gradLastLine - i); - } - - // Dibuja el sprite - sprite->render(); - - // Escribe el texto - text->setZoom(2); - text->writeDX(TXT_CENTER | TXT_STROKE, options->screen.nativeWidth / 2, text->getCharacterSize(), "Jail Engine DEMO", 1, {255, 255, 255}, 1, {0, 0, 192}); - text->disableZoom(); - text->writeDX(TXT_CENTER | TXT_COLOR | TXT_STROKE, options->screen.nativeWidth / 2, text->getCharacterSize() * 4, "2023 JailDesigner", 1, {240, 240, 240}, 1, {0, 0, 192}); - debugText->writeDX(TXT_CENTER | TXT_COLOR | TXT_STROKE, options->screen.nativeWidth / 2, text->getCharacterSize() * 7, "Pulsa 'F1' o 'F2' para disminuir o aumentar la ventana", 1, {240, 240, 240}, 1, {0, 0, 192}); - debugText->writeDX(TXT_CENTER | TXT_COLOR | TXT_STROKE, options->screen.nativeWidth / 2, text->getCharacterSize() * 9, "Pulsa 'N' para mostrar una notificacion", 1, {240, 240, 240}, 1, {0, 0, 192}); - debugText->writeDX(TXT_CENTER | TXT_COLOR | TXT_STROKE, options->screen.nativeWidth / 2, text->getCharacterSize() * 11, controllerName, 1, {240, 240, 240}, 1, {0, 0, 192}); - debugText->writeDX(TXT_CENTER | TXT_COLOR | TXT_STROKE, options->screen.nativeWidth / 2, text->getCharacterSize() * 13, inputPressed, 1, {240, 240, 240}, 1, {0, 0, 192}); - debugText->writeDX(TXT_CENTER | TXT_COLOR | TXT_STROKE, options->screen.nativeWidth / 2, options->screen.nativeHeight - (text->getCharacterSize() * 2), "Pulsa 'ESCAPE' para terminar el programa", 1, {240, 240, 240}, 1, {0, 0, 192}); - - // Vuelca el buffer en pantalla - screen->blit(); + sprite->setVelX(spr_force * spr_direction); + JA_PlaySound(sound); } + if (sprite->getPosY() + sprite->getHeight() > options->screen.nativeHeight or sprite->getPosY() < 0) + { + sprite->undoMoveY(); + int spr_direction = 1; + int spr_force = 1; + if (sprite->getVelY() > 0) + { + spr_direction = -1; + } + if (SDL_GetTicks() % 2 == 0) + { + spr_force = 2; + } + sprite->setVelY(spr_force * spr_direction); + JA_PlaySound(sound); + } + + sprite->update(); +} + +// Actualiza el degradado +void updateGradient() +{ + if (counter % 1 == 0) + { + gradBreathDirection == 0 ? gradCurrentColor-- : gradCurrentColor++; + if (gradCurrentColor == gradColorMin) + { + gradBreathDirection = 1; + } + if (gradCurrentColor == gradColorMax) + { + gradBreathDirection = 0; + } + } +} + +// Actualiza la lógica del programa +void update() +{ + // Comprueba el teclado y los eventos + checkEvents(); + + // Comprueba el objeto input + checkInput(); + + // Actualiza la lógica del programa + if (SDL_GetTicks() - ticks > ticksSpeed) + { + // Actualiza la variable + ticks = SDL_GetTicks(); + + // Incrementa el contador + counter++; + + // Actualiza el objeto screen + screen->update(); + + // Actualiza el sprite + updateSprite(); + + // Actualiza el degradado + updateGradient(); + } +} + +// Dibuja un degradado de fondo +void renderGradient() +{ + const int gradFirstLine = options->screen.nativeHeight / 3; + const int gradLastLine = options->screen.nativeHeight; + const int gradNumLines = gradLastLine - gradFirstLine; + const int gradColorFrom = 0; + + for (int i = gradFirstLine; i < gradLastLine; ++i) + { + float step = ((float)(i - gradFirstLine) / gradNumLines); + int color = gradColorFrom + ((gradCurrentColor - gradColorFrom) * step); + SDL_SetRenderDrawColor(renderer, color, 0x00, 0x00, 0xFF); + SDL_RenderDrawLine(renderer, 0, i, options->screen.nativeWidth, i); + } + + for (int i = gradLastLine; i > gradFirstLine; --i) + { + float step = ((float)(i - gradFirstLine) / gradNumLines); + int alpha = 0 + ((255 - 0) * step); + SDL_SetRenderDrawColor(renderer, 0x00, 0x00, 0xFF, alpha); + SDL_RenderDrawLine(renderer, 0, gradLastLine - i, options->screen.nativeWidth, gradLastLine - i); + } +} + +// Dibuja el texto +void renderText() +{ + text->setZoom(2); + text->writeDX(TXT_CENTER | TXT_STROKE, options->screen.nativeWidth / 2, text->getCharacterSize(), "Jail Engine DEMO", 1, {255, 255, 255}, 1, {0, 0, 192}); + text->disableZoom(); + text->writeDX(TXT_CENTER | TXT_COLOR | TXT_STROKE, options->screen.nativeWidth / 2, text->getCharacterSize() * 4, "2023 JailDesigner", 1, {240, 240, 240}, 1, {0, 0, 192}); + debugText->writeDX(TXT_CENTER | TXT_COLOR | TXT_STROKE, options->screen.nativeWidth / 2, text->getCharacterSize() * 7, "Pulsa 'F1' o 'F2' para disminuir o aumentar la ventana", 1, {240, 240, 240}, 1, {0, 0, 192}); + debugText->writeDX(TXT_CENTER | TXT_COLOR | TXT_STROKE, options->screen.nativeWidth / 2, text->getCharacterSize() * 9, "Pulsa 'N' para mostrar una notificacion", 1, {240, 240, 240}, 1, {0, 0, 192}); + debugText->writeDX(TXT_CENTER | TXT_COLOR | TXT_STROKE, options->screen.nativeWidth / 2, text->getCharacterSize() * 11, controllerName, 1, {240, 240, 240}, 1, {0, 0, 192}); + debugText->writeDX(TXT_CENTER | TXT_COLOR | TXT_STROKE, options->screen.nativeWidth / 2, text->getCharacterSize() * 13, inputPressed, 1, {240, 240, 240}, 1, {0, 0, 192}); + debugText->writeDX(TXT_CENTER | TXT_COLOR | TXT_STROKE, options->screen.nativeWidth / 2, options->screen.nativeHeight - (text->getCharacterSize() * 2), "Pulsa 'ESCAPE' para terminar el programa", 1, {240, 240, 240}, 1, {0, 0, 192}); +} + +// Dibuja los elementos del programa en pantalla +void render() +{ + // Prepara el objeto screen para dibujar + screen->start(); + screen->clean(); + + // Dibuja un degradado de fondo + renderGradient(); + + // Dibuja el sprite + sprite->render(); + + // Dinuja el texto + renderText(); + + // Vuelca el buffer en pantalla + screen->blit(); +} + +// Libera la memoria reservada +void freeAll() +{ // Finaliza el sprite if (sprite != nullptr) - { delete sprite; - } if (texture != nullptr) - { delete texture; - } // Finaliza el texto if (text != nullptr) - { delete text; - } if (debugText != nullptr) - { delete debugText; - } // Finaliza el objeto input if (input != nullptr) - { delete input; - } // Finaliza el objeto screen if (screen != nullptr) - { delete screen; - } // Finaliza jail_audio JA_DeleteSound(sound); @@ -327,24 +482,37 @@ int main(int argc, char *argv[]) // Finaliza el objeto con la lista de recuros if (asset != nullptr) - { delete asset; - } // Finaliza las opciones if (options != nullptr) - { delete options; - } // Finaliza SDL y la ventana if (event != nullptr) - { delete event; - } SDL_DestroyRenderer(renderer); SDL_DestroyWindow(window); SDL_Quit(); +} + +int main(int argc, char *argv[]) +{ + // Inicializa todo + initAll(argv); + + // Bucle principal + while (!should_exit) + { + // Actualiza la lógica del programa + update(); + + // Dibuja los elementos del programa en pantalla + render(); + } + + // Libera la memoria reservada + freeAll(); return 0; -} +} \ No newline at end of file