Devo usare i file di testo per i miei dati di salvataggio?


22

La mia domanda è se devo usare i file di testo per salvare i miei dati di gioco. Ho alcune preoccupazioni di base nel fare questo:

  1. Non c'è davvero modo di proteggere i dati, e quindi l'utente potrebbe rovinare tutto se li toccasse e non voglio che ciò accada.

  2. Probabilmente non è il modo più efficiente per archiviare i miei dati (ce ne saranno molti)

So come analizzare / scrivere in modo efficace i file di testo, quindi per la prototipazione sono stati fantastici. Voglio solo guardare al futuro per quello a cui dovrei pensare di passare in modo che non mi dia un pugno in faccia vicino alla fine dello sviluppo.

Se non dovessi usare file di testo, cosa dovrei usare? Ho bisogno di qualcosa di compatibile con C ++.


2
File zip (con password) - ci sono molte librerie disponibili che ti permetteranno di farlo, e dovrebbe risparmiare spazio su disco
SeanC

2
Applicare una semplice cifra come en.wikipedia.org/wiki/ROT13 dovrebbe essere sufficiente per impedire all'utente medio di modificare i file. Probabilmente tutti gli altri sanno cosa stanno facendo comunque.
Exilyth,

1
Fallo a modo tuo, ma mi piace che i miei giochi siano facilmente modificabili.
mmyers

Risposte:


28

Per ora, poiché hai appena iniziato, i file di testo sono probabilmente OK. Ci sono un paio di preoccupazioni nella tua domanda che affronterò.

  1. La protezione dei dati non è cruciale come probabilmente pensi. Se il tuo gioco è multiplayer, avrai comunque i dati salvati sul lato server. Se il tuo gioco è single player, quindi cosa succede se i giocatori modificano i dati? Se rompono qualcosa, è davvero colpa loro e possono reinstallare.

  2. Le prestazioni sono anche qualcos'altro che spesso non riusciamo a pianificare correttamente. Non dovresti davvero ottimizzare fino a quando non misuri effettivamente un problema di prestazioni. La mia ipotesi è che probabilmente avrai una quantità di dati che non è così grande e che i file di testo andranno bene.

Detto questo, la soluzione migliore è quella di astrarre le routine di salvataggio e caricamento dei dati nel miglior modo possibile. Ad esempio, puoi avere una classe base, ad esempio DataWriter, e quindi fornire diverse implementazioni dei suoi diversi metodi. Un esempio molto semplice sarebbe simile a:

class DataWriter {
  virtual void save(GameState state) = 0;

  virtual ~DataWriter() { }
};

class TextFileDataWriter : public DataWriter {
  virtual void save(GameState state) {
    //write to text file
  }
};

class DatabaseDataWriter : public DataWriter {
  virtual void save(GameState state) {
    //write to database
  }
};

Quando alla fine modifichi il tuo gioco e ti rendi conto che il collo di bottiglia delle prestazioni è nella routine di scrittura dei file, puoi fornire un'altra implementazione di quella classe (ad esempio per scrivere su un database) con modifiche minime al codice chiamante.


È un gioco per giocatore singolo, e quelli erano i miei pensieri esattamente se volessero pasticciare con i dati. Non lo so, qualcosa sui file di testo sembrava poco professionale, e ho pensato che se potevo impedire all'utente di rovinare, probabilmente dovrei. Inoltre, cosa intendi quando dici "Database"? L'ho sentito spesso, ma non ho idea della definizione esatta o del tipo di file che comporta.
Althezel,

6
@Althezel Il fatto è che, indipendentemente da come salvi i tuoi dati, qualcuno sarà abbastanza determinato da modificarli. In questo senso, di solito è uno spreco del tuo prezioso tempo di sviluppo cercare di mettere in atto protezioni :)
pwny

@Althezel Per quanto riguarda i database, pensalo come una sorta di motore a cui trasmetti le richieste per leggere o scrivere i dati. Tale motore è responsabile del salvataggio / lettura in modo efficiente, di solito in forma relazionale nelle tabelle. Nel tuo caso d'uso, darei un'occhiata a SQLite ( sqlite.org ). Fondamentalmente useresti una libreria C ++ per connetterti a un database SQLite locale (SQLite usa i file locali) e passare quelle chiamate della libreria nella sintassi SQL per accedere ai tuoi dati.
pwny

2
È un mondo triste quando gli sviluppatori vogliono essere in grado di bloccare gli utenti dalle informazioni che memorizzano sui loro computer.
ClassicThunder

2
Usare i file di testo è davvero poco professionale perché pochissimi giochi memorizzano cose come "save-data.txt" - ma se hai mai trascorso del tempo a cercare nella maggior parte dei file di gioco salvati, scoprirai che spesso non sono altro che file di testo a cui talvolta sono stati aggiunti dati binari. Ogni gioco della serie Civilization e Total War, ad esempio, utilizza file .txt effettivi per un'ampia varietà di dati di gioco. L'upgrade più comune per questo è un sistema di database che finisce per archiviare i dati come file flat che - ad eccezione di alcuni BLOB binari - è solo un file di testo.
BrianH,

3

La parola Dati di gioco può significare molte cose, per esempio

  • gamestate
  • File di configurazione
  • Mappe, trame, suoni, script, dati di animazione, ...
  • Localizzazione
  • Dati di layout della GUI
  • più a cui non ho pensato

Per ogni categoria puoi adottare un altro approccio.

Ad esempio, è possibile utilizzare SQLite per roba di localizzazione, binario per Mappe, trame, suoni e così via.

Per le cose di configurazione dovresti usare file xml facili da cambiare.

Come sempre, la risposta corretta è "dipende".

Esistono molti parser xml con un'associazione c ++ ed esiste anche un'associazione c ++ per SQLite.


Potrebbe essere una cosa religiosa ma preferirei utilizzare il formato di file INI per le configurazioni invece di XML. Quest'ultimo sembra eccessivo per questo scenario. E c'è un lettore INI nelle librerie boost.
Artur Czajka,

0

È possibile salvare i dati come un BLOB binario e inviare nuovamente i dati in streaming quando si accede a quel file. Ciò risolverebbe entrambi i tuoi problemi. Assicurati solo che il codice di serializzazione sia esattamente lo stesso della deserializzazione.

Lo streaming nel BLOB binario è relativamente veloce e impedisce inoltre all'utente di visualizzare e modificare i dati.

Puoi ottenere tutto ciò usando i flussi di libreria standard.


2
Mentre il BLOB binario è semplice e veloce (sia per lo sviluppo che per il caricamento / esecuzione), il problema più grande che ho avuto con il BLOB binario è non appena si cambia qualcosa sull'organizzazione della struttura dei dati (tanto quanto aggiungere un singolo floatmembro a un singolo oggetto), i vecchi salvataggi diventano completamente non validi. Questo è difficile da affrontare durante lo sviluppo, ma se sei all'altezza, allora sicuramente.
Bobobobo,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.