moguts els dos metodes per llegir i escriure la tabla de puntuacions a fitxer a la classe ManageHiScoreTable

el fitxer amb les puntuacions ara nomes es llig al carregar el programa i no cada volta que començem a jugar
This commit is contained in:
2024-08-16 12:42:34 +02:00
parent 7d778a9cfa
commit 89979a8ddb
5 changed files with 117 additions and 136 deletions
+92
View File
@@ -1,4 +1,5 @@
#include "manage_hiscore_table.h"
#include <iostream>
// Constructor
ManageHiScoreTable::ManageHiScoreTable(std::vector<hiScoreEntry_t> *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;
}