From 89979a8ddb164c0250481da75d228c09f358ca08 Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Fri, 16 Aug 2024 12:42:34 +0200 Subject: [PATCH] =?UTF-8?q?moguts=20els=20dos=20metodes=20per=20llegir=20i?= =?UTF-8?q?=20escriure=20la=20tabla=20de=20puntuacions=20a=20fitxer=20a=20?= =?UTF-8?q?la=20classe=20ManageHiScoreTable=20el=20fitxer=20amb=20les=20pu?= =?UTF-8?q?ntuacions=20ara=20nomes=20es=20llig=20al=20carregar=20el=20prog?= =?UTF-8?q?rama=20i=20no=20cada=20volta=20que=20comen=C3=A7em=20a=20jugar?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/director.cpp | 8 +- source/game.cpp | 134 +++----------------------------- source/game.h | 7 -- source/manage_hiscore_table.cpp | 92 ++++++++++++++++++++++ source/manage_hiscore_table.h | 12 ++- 5 files changed, 117 insertions(+), 136 deletions(-) diff --git a/source/director.cpp b/source/director.cpp index b94a967..b74e602 100644 --- a/source/director.cpp +++ b/source/director.cpp @@ -49,6 +49,11 @@ Director::Director(int argc, char *argv[]) // Carga el fichero de configuración loadConfigFile(); + // Carga el fichero de puntuaciones + ManageHiScoreTable *manager = new ManageHiScoreTable(&options->game.hiScoreTable); + manager->loadFromFile(asset->get("score.bin")); + delete manager; + // Inicializa SDL initSDL(); @@ -473,9 +478,6 @@ void Director::initOptions() // Opciones de juego options->game.difficulty = DIFFICULTY_NORMAL; options->game.language = ba_BA; - ManageHiScoreTable *m = new ManageHiScoreTable(&options->game.hiScoreTable); - m->clear(); - delete m; // Opciones de control options->controller.clear(); diff --git a/source/game.cpp b/source/game.cpp index d688c96..16832b7 100644 --- a/source/game.cpp +++ b/source/game.cpp @@ -42,9 +42,6 @@ Game::Game(int playerID, int currentStage, Screen *screen, Asset *asset, Lang *l loadDemoFile(asset->get("demo2.bin"), &this->demo.dataFile[index2]); } - // Carga el fichero con la tabla de puntuaciones - loadScoreFile(); - n1000Sprite = new SmartSprite(gameTextTexture); n2500Sprite = new SmartSprite(gameTextTexture); n5000Sprite = new SmartSprite(gameTextTexture); @@ -63,7 +60,10 @@ Game::Game(int playerID, int currentStage, Screen *screen, Asset *asset, Lang *l Game::~Game() { - saveScoreFile(); + // Guarda las puntuaciones en un fichero + ManageHiScoreTable *manager = new ManageHiScoreTable(&options->game.hiScoreTable); + manager->saveToFile(asset->get("score.bin")); + delete manager; #ifdef RECORDING saveDemoFile(); #endif @@ -163,6 +163,8 @@ void Game::init(int playerID) scoreboard->setMode(SCOREBOARD_CENTER_PANEL, SCOREBOARD_MODE_STAGE_INFO); // Resto de variables + hiScore.score = options->game.hiScoreTable[0].score; + hiScore.name = options->game.hiScoreTable[0].name; paused = false; gameCompleted = false; gameCompletedCounter = 0; @@ -630,77 +632,6 @@ void Game::unloadMedia() JA_DeleteSound(coffeeMachineSound); } -// Carga el fichero con la tabla de puntuaciones -bool Game::loadScoreFile() -{ - bool success = true; - const std::string p = asset->get("score.bin"); - const std::string filename = p.substr(p.find_last_of("\\/") + 1); - SDL_RWops *file = SDL_RWFromFile(p.c_str(), "r+b"); - if (file) - { - // Cargamos los datos - if (options->console) - { - std::cout << "Reading file: " << filename.c_str() << std::endl; - } - for (int i = 0; i < (int)options->game.hiScoreTable.size(); ++i) - { - int nameSize = 0; - - if (SDL_RWread(file, &options->game.hiScoreTable[i].score, sizeof(int), 1) == 0) - { - success = false; - break; - } - - if (SDL_RWread(file, &nameSize, sizeof(int), 1) == 0) - { - success = false; - break; - } - - char *name = (char *)malloc(nameSize + 1); - if (SDL_RWread(file, name, sizeof(char) * nameSize, 1) == 0) - { - success = false; - free(name); - break; - } - else - { - name[nameSize] = 0; - options->game.hiScoreTable[i].name = name; - free(name); - } -#ifdef DEBUG - if (false) - { - std::cout << "score: " << options->game.hiScoreTable[i].score << std::endl; - std::cout << "nsize: " << nameSize << std::endl; - std::cout << "name : " << options->game.hiScoreTable[i].name << std::endl; - std::cout << " ---" << std::endl; - } -#endif - } - - SDL_RWclose(file); - } - - if (!success) - { - ManageHiScoreTable *m = new ManageHiScoreTable(&options->game.hiScoreTable); - m->clear(); - delete m; - } - - // Establece el valor de la variable desde la tabla de records - hiScore.score = options->game.hiScoreTable[0].score; - hiScore.name = options->game.hiScoreTable[0].name; - - return success; -} - // Carga el fichero de datos para la demo bool Game::loadDemoFile(std::string f, demoKeys_t (*dataFile)[TOTAL_DEMO_DATA]) { @@ -778,51 +709,6 @@ bool Game::loadDemoFile(std::string f, demoKeys_t (*dataFile)[TOTAL_DEMO_DATA]) return success; } -// Guarda el fichero de puntos -bool Game::saveScoreFile() -{ - bool success = true; - const std::string p = asset->get("score.bin"); - const std::string filename = p.substr(p.find_last_of("\\/") + 1); - SDL_RWops *file = SDL_RWFromFile(p.c_str(), "w+b"); - if (file) - { - // Guarda los datos - for (int i = 0; i < (int)options->game.hiScoreTable.size(); ++i) - { - SDL_RWwrite(file, &options->game.hiScoreTable[i].score, sizeof(int), 1); - const int nameSize = (int)options->game.hiScoreTable[i].name.size(); - SDL_RWwrite(file, &nameSize, sizeof(int), 1); - SDL_RWwrite(file, options->game.hiScoreTable[i].name.c_str(), nameSize, 1); -#ifdef DEBUG - if (false) - { - std::cout << "score: " << options->game.hiScoreTable[i].score << std::endl; - std::cout << "nsize: " << nameSize << std::endl; - std::cout << "name : " << options->game.hiScoreTable[i].name << std::endl; - std::cout << " ---" << std::endl; - } -#endif - } - - if (options->console) - { - std::cout << "Writing file: " << filename.c_str() << std::endl; - } - - // Cierra el fichero - SDL_RWclose(file); - } - else - { - if (options->console) - { - std::cout << "Error: Unable to save " << filename.c_str() << " file! " << SDL_GetError() << std::endl; - } - } - return success; -} - #ifdef RECORDING // Guarda el fichero de datos para la demo bool Game::saveDemoFile() @@ -2858,10 +2744,10 @@ void Game::pause(bool value) // Añade una puntuación a la tabla de records void Game::addScoreToScoreBoard(std::string name, int score) { - hiScoreEntry_t entry = {name, score}; - ManageHiScoreTable *m = new ManageHiScoreTable(&options->game.hiScoreTable); - m->add(entry); - delete m; + const hiScoreEntry_t entry = {name, score}; + ManageHiScoreTable *manager = new ManageHiScoreTable(&options->game.hiScoreTable); + manager->add(entry); + delete manager; } // Comprueba el estado de los jugadores diff --git a/source/game.h b/source/game.h index 6af9739..5991bc9 100644 --- a/source/game.h +++ b/source/game.h @@ -222,19 +222,12 @@ private: // Libera los recursos previamente cargados void unloadMedia(); - // Carga el fichero con la tabla de puntuaciones - bool loadScoreFile(); - // Carga el fichero de datos para la demo bool loadDemoFile(std::string fileName, demoKeys_t (*dataFile)[TOTAL_DEMO_DATA]); - - // Guarda el fichero de puntos - bool saveScoreFile(); #ifdef RECORDING // Guarda el fichero de datos para la demo bool saveDemoFile(); #endif - // Crea una formación de enemigos void deployEnemyFormation(); diff --git a/source/manage_hiscore_table.cpp b/source/manage_hiscore_table.cpp index e3e7650..50b97a1 100644 --- a/source/manage_hiscore_table.cpp +++ b/source/manage_hiscore_table.cpp @@ -1,4 +1,5 @@ #include "manage_hiscore_table.h" +#include // Constructor ManageHiScoreTable::ManageHiScoreTable(std::vector *table) @@ -55,4 +56,95 @@ void ManageHiScoreTable::sort() } customLess; std::sort(table->begin(), table->end(), customLess); +} + +// Carga la tabla con los datos de un fichero +bool ManageHiScoreTable::loadFromFile(std::string filepath) +{ + clear(); + + bool success = true; + const std::string p = filepath; + const std::string filename = p.substr(p.find_last_of("\\/") + 1); + SDL_RWops *file = SDL_RWFromFile(p.c_str(), "r+b"); + + if (file) + { +#ifdef DEBUG + std::cout << "Reading file: " << filename.c_str() << std::endl; +#endif + for (int i = 0; i < (int)table->size(); ++i) + { + int nameSize = 0; + + if (SDL_RWread(file, &table->at(i).score, sizeof(int), 1) == 0) + { + success = false; + break; + } + + if (SDL_RWread(file, &nameSize, sizeof(int), 1) == 0) + { + success = false; + break; + } + + char *name = (char *)malloc(nameSize + 1); + if (SDL_RWread(file, name, sizeof(char) * nameSize, 1) == 0) + { + success = false; + free(name); + break; + } + else + { + name[nameSize] = 0; + table->at(i).name = name; + free(name); + } + } + + SDL_RWclose(file); + } + + if (!success) + { + clear(); + } + + return success; +} + +// Guarda la tabla en un fichero +bool ManageHiScoreTable::saveToFile(std::string filepath) +{ + bool success = true; + const std::string p = filepath; + const std::string filename = p.substr(p.find_last_of("\\/") + 1); + SDL_RWops *file = SDL_RWFromFile(p.c_str(), "w+b"); + + if (file) + { + // Guarda los datos + for (int i = 0; i < (int)table->size(); ++i) + { + SDL_RWwrite(file, &table->at(i).score, sizeof(int), 1); + const int nameSize = (int)table->at(i).name.size(); + SDL_RWwrite(file, &nameSize, sizeof(int), 1); + SDL_RWwrite(file, table->at(i).name.c_str(), nameSize, 1); + } + +#ifdef DEBUG + std::cout << "Writing file: " << filename.c_str() << std::endl; +#endif + // Cierra el fichero + SDL_RWclose(file); + } + else + { +#ifdef DEBUG + std::cout << "Error: Unable to save " << filename.c_str() << " file! " << SDL_GetError() << std::endl; +#endif + } + return success; } \ No newline at end of file diff --git a/source/manage_hiscore_table.h b/source/manage_hiscore_table.h index 5d81bb2..5243a8d 100644 --- a/source/manage_hiscore_table.h +++ b/source/manage_hiscore_table.h @@ -5,8 +5,10 @@ /* Esta clase sirve para añadir elementos hiScoreEntry_r a un vector (tabla), de manera - que la tabla siempre está ordenada. Además también tiene un método para dejar la tabla - con sus valores iniciales + que la tabla siempre está ordenada. + + Además tiene un método para dejar la tabla con sus valores iniciales y métodos para + leer y escribir la tabla a un fichero */ // Clase ManageHiScoreTable @@ -31,4 +33,10 @@ public: // Añade un elemento a la tabla void add(hiScoreEntry_t entry); + + // Carga la tabla con los datos de un fichero + bool loadFromFile(std::string filepath); + + // Guarda la tabla en un fichero + bool saveToFile(std::string filepath); }; \ No newline at end of file