2010-01-21 5 views
2

Je travaille sur un petit jeu roguelike, et j'ai besoin d'aide pour créer des parties de sauvegarde. J'ai essayé plusieurs façons de sauvegarder des parties, mais la charge échoue toujours, parce que je ne suis pas sûr de ce qui est un bon moyen de marquer le début de différentes sections pour le joueur, les entités et la carte.Fichier binaire et formatage du jeu sauvegardé

Quel serait un bon moyen de marquer le début de chaque section, de sorte que les données peuvent relire de manière fiable sans connaître la longueur de chaque section?

Modifier: La langue est C++. Il semble qu'un format lisible serait un meilleur coup. Merci pour toutes les réponses rapides.

+3

Quelle langue utilisez-vous? Cela peut affecter les suggestions de choses telles que la sérialisation des objets d'état, etc. – JMD

+1

En outre, cette question très similaire vous aide-t-elle? http://stackoverflow.com/questions/433293/how-to-save-and-load-a-text-mode-game – JMD

Répondre

1

Si vous avez un marqueur, vous devez garantir que le motif n'existe pas ailleurs dans votre flux binaire. S'il existe, vous devez utiliser une séquence d'échappement spéciale pour le différencier. Le Telnet protocol utilise 0xFF pour marquer les commandes spéciales qui ne font pas partie du flux de données. Chaque fois que le flux de données contient un 0xFF naturel, il doit être remplacé par 0xFFFF.

Vous utiliseriez donc un marqueur de 2 octets pour commencer une nouvelle section, comme 0xFF01. Si votre lecteur voit 0xFF01, c'est une nouvelle section. S'il voit 0xFFFF, vous le réduisez en un seul 0xFF. Naturellement, vous pouvez étendre cette approche pour utiliser n'importe quel marqueur de longueur que vous voulez. (Bien que mes préférences personnelles soient un format texte (éventuellement compressé) ou un format binaire avec des octets de longueur au lieu de marqueurs, je ne comprends pas comment vous procédez à la sérialisation sans savoir quand vous avez fini de lire une structure de données Etes-vous vraiment sûr que vous avez besoin de format binaire?)

+0

Merci pour l'explication. Je pense à garder les données cartographiques (tableau 2D) dans des fichiers binaires séparés, dans le reste un fichier texte. –

+0

Vous n'avez pas mentionné les données cartographiques - un bon format de texte pour cela est CSV –

2

Pourquoi ne pas stocker dans un format de texte afin qu'il puisse être facilement analysable, qu'il s'agisse de texte brut, XML ou YAML.

+1

Je dois appuyer ceci. Spécialement pour le développement, il est très utile d'avoir des fichiers de sauvegarde lisibles par l'homme (et encore mieux, éditables). – Dolphin

+0

Plus vous pouvez toujours le fermer assez bien. ;) – user76035

3

La solution la plus simple consiste généralement à utiliser une bibliothèque pour écrire les données en utilisant XML ou INI, puis à les compresser. Cela sera plus facile à analyser et donnera des fichiers plus petits qu'un format binaire personnalisé.
Bien sûr, ils prendront un peu plus de temps à charger (mais pas beaucoup, à moins que vos fichiers de données sont 100 de SCG)

Si vous êtes déterminé à utiliser un format binaire, jetez un oeil à BER.

+1

+1 pour mentionner BER –

+0

Les fichiers ne seront pas grands du tout, donc la perte de vitesse ne sera pas perceptible du tout. –

2

Puisque vous enregistrez des données binaires, vous ne pouvez pas utiliser de marqueurs sans longueur. Il suffit d'écrire le nombre d'enregistrements de tout type, puis les données structurées, puis il sera facile à lire à nouveau. Si vous avez des éléments de longueur variable comme une chaîne, vous avez également besoin d'informations sur la longueur.

2 
player record 
player record 
3 
entities record 
entities record 
entities record 
1 
map