#include "demo.h" // Constructor Demo::Demo(SDL_Renderer *renderer, Screen *screen, Resource *resource, Asset *asset, options_t *options, Debug *debug) { // Inicia algunas variables board.iniClock = SDL_GetTicks(); rooms.push_back("03.room"); rooms.push_back("54.room"); rooms.push_back("16.room"); rooms.push_back("45.room"); rooms.push_back("60.room"); rooms.push_back("58.room"); //rooms.push_back("01.room"); //rooms.push_back("02.room"); //rooms.push_back("03.room"); //rooms.push_back("04.room"); //rooms.push_back("05.room"); //rooms.push_back("06.room"); //rooms.push_back("07.room"); //rooms.push_back("08.room"); //rooms.push_back("09.room"); //rooms.push_back("10.room"); //rooms.push_back("11.room"); //rooms.push_back("12.room"); //rooms.push_back("13.room"); //rooms.push_back("14.room"); //rooms.push_back("15.room"); //rooms.push_back("16.room"); //rooms.push_back("17.room"); //rooms.push_back("18.room"); //rooms.push_back("19.room"); //rooms.push_back("20.room"); //rooms.push_back("21.room"); //rooms.push_back("22.room"); //rooms.push_back("23.room"); //rooms.push_back("24.room"); //rooms.push_back("25.room"); //rooms.push_back("26.room"); //rooms.push_back("27.room"); //rooms.push_back("28.room"); //rooms.push_back("29.room"); //rooms.push_back("30.room"); //rooms.push_back("31.room"); //rooms.push_back("32.room"); //rooms.push_back("33.room"); //rooms.push_back("34.room"); //rooms.push_back("35.room"); //rooms.push_back("36.room"); //rooms.push_back("37.room"); //rooms.push_back("38.room"); //rooms.push_back("39.room"); //rooms.push_back("40.room"); //rooms.push_back("41.room"); //rooms.push_back("42.room"); //rooms.push_back("43.room"); //rooms.push_back("44.room"); //rooms.push_back("45.room"); //rooms.push_back("46.room"); //rooms.push_back("47.room"); //rooms.push_back("48.room"); //rooms.push_back("49.room"); //rooms.push_back("50.room"); //rooms.push_back("51.room"); //rooms.push_back("52.room"); //rooms.push_back("53.room"); //rooms.push_back("54.room"); //rooms.push_back("55.room"); //rooms.push_back("56.room"); //rooms.push_back("57.room"); //rooms.push_back("58.room"); //rooms.push_back("59.room"); //rooms.push_back("60.room"); roomIndex = 0; currentRoom = rooms.at(roomIndex); // Copia los punteros this->resource = resource; this->renderer = renderer; this->asset = asset; this->screen = screen; this->debug = debug; this->options = options; // Crea los objetos itemTracker = new ItemTracker(); scoreboard = new ScoreBoard(renderer, resource, asset, options, &board); room = new Room(resource->getRoom(currentRoom), renderer, screen, asset, options, itemTracker, &board.items, debug); eventHandler = new SDL_Event(); text = new Text(resource->getOffset("smb2.txt"), resource->getTexture("smb2.png"), renderer); // Inicializa el resto de variables counter = 0; roomTime = 400; roomTime = 200; ticks = 0; ticksSpeed = 15; board.lives = 9; board.items = 0; board.rooms = 1; const color_t c = room->getBorderColor(); board.color = (c.r + c.g + c.b == 0) ? stringToColor(options->palette, "white") : c; // Si el color es negro lo cambia a blanco board.music = !debug->getEnabled(); section.name = SECTION_PROG_DEMO; section.subsection = 0; } Demo::~Demo() { // Libera la memoria de los objetos delete itemTracker; delete scoreboard; delete room; delete eventHandler; delete text; } // Comprueba los eventos de la cola void Demo::checkEventHandler() { // Comprueba los eventos que hay en la cola while (SDL_PollEvent(eventHandler) != 0) { // Evento de salida de la aplicación if (eventHandler->type == SDL_QUIT) { section.name = SECTION_PROG_QUIT; screen->setBorderColor(stringToColor(options->palette, "black")); break; } // Comprueba las teclas que se han pulsado if ((eventHandler->type == SDL_KEYDOWN && eventHandler->key.repeat == 0) || (eventHandler->type == SDL_JOYBUTTONDOWN)) { switch (eventHandler->key.keysym.scancode) { case SDL_SCANCODE_ESCAPE: section.name = SECTION_PROG_QUIT; break; case SDL_SCANCODE_B: screen->switchBorder(); resource->reLoadTextures(); break; case SDL_SCANCODE_F: screen->switchVideoMode(); resource->reLoadTextures(); break; case SDL_SCANCODE_F1: screen->setWindowSize(1); resource->reLoadTextures(); break; case SDL_SCANCODE_F2: screen->setWindowSize(2); resource->reLoadTextures(); break; case SDL_SCANCODE_F3: screen->setWindowSize(3); resource->reLoadTextures(); break; case SDL_SCANCODE_F4: screen->setWindowSize(4); resource->reLoadTextures(); break; case SDL_SCANCODE_F5: switchPalette(); break; default: section.name = SECTION_PROG_TITLE; section.subsection = 0; break; } } } } // Bucle para el juego section_t Demo::run() { while (section.name == SECTION_PROG_DEMO) { update(); render(); } return section; } // Actualiza el juego, las variables, comprueba la entrada, etc. void Demo::update() { // Comprueba que la diferencia de ticks sea mayor a la velocidad del juego if (SDL_GetTicks() - ticks > ticksSpeed) { // Actualiza el contador de ticks ticks = SDL_GetTicks(); // Comprueba los eventos de la cola checkEventHandler(); // Actualiza los objetos room->update(); scoreboard->update(); screen->updateFX(); checkRoomChange(); } } // Pinta los objetos en pantalla void Demo::render() { // Prepara para dibujar el frame screen->start(); screen->clean(room->getBGColor()); room->renderMap(); room->renderEnemies(); room->renderItems(); renderRoomName(); scoreboard->render(); screen->renderFX(); // Actualiza la pantalla screen->blit(); } // Escribe el nombre de la pantalla void Demo::renderRoomName() { // Texto en el centro de la pantalla SDL_Rect rect = {0, 16 * BLOCK, PLAY_AREA_WIDTH, BLOCK * 2}; color_t color = stringToColor(options->palette, "white"); SDL_SetRenderDrawColor(renderer, color.r, color.g, color.b, 0xFF); SDL_RenderFillRect(renderer, &rect); text->writeDX(TXT_CENTER | TXT_COLOR, GAMECANVAS_CENTER_X, 16 * 8 + 4, room->getName(), 1, room->getBGColor()); } // Recarga todas las texturas void Demo::reLoadTextures() { room->reLoadTexture(); scoreboard->reLoadTexture(); text->reLoadTexture(); } // Cambia la paleta void Demo::switchPalette() { // Modifica la variable if (options->palette == p_zxspectrum) { options->palette = p_zxarne; } else { options->palette = p_zxspectrum; } room->reLoadPalette(); scoreboard->reLoadPalette(); const color_t c = room->getBorderColor(); board.color = (c.r + c.g + c.b == 0) ? stringToColor(options->palette, "white") : c; // Si el color es negro lo cambia a blanco } // Cambia de habitación bool Demo::changeRoom(std::string file) { // En las habitaciones los limites tienen la cadena del fichero o un 0 en caso de no limitar con nada if (file != "0") // Verifica que exista el fichero que se va a cargar if (asset->get(file) != "") { // Elimina la habitación actual delete room; room = nullptr; // Crea un objeto habitación nuevo a partir del fichero room = new Room(resource->getRoom(file), renderer, screen, asset, options, itemTracker, &board.items, debug); // Actualiza el marcador const color_t c = room->getBorderColor(); // Pone el color del marcador board.color = (c.r + c.g + c.b == 0) ? stringToColor(options->palette, "white") : c; // Si el color es negro lo cambia a blanco return true; } return false; } // Comprueba si se ha de cambiar de habitación void Demo::checkRoomChange() { counter++; if (counter == roomTime) { counter = 0; roomIndex++; if (roomIndex == (int)rooms.size()) { section.name = SECTION_PROG_LOGO; section.subsection = SUBSECTION_LOGO_TO_TITLE; } else { changeRoom(rooms.at(roomIndex)); } } }