Moteur de jeu Godot/Tutoriel/Fichiers
charger et sauvegarder dans des fichiers avec gdscript
modifierCe tutoriel explique comment permettre au joueur de sauver/charger sa partie mais pas que...
Vous devez déjà savoir:
modifier- Le fonctionnement de base du système de fichier de votre appareil (ordinateur de préférence) et éventuellement comment accéder aux fichiers cachés de votre répertoire utilisateur. Vous avez surement déjà lu quelque chose du genre "C:\Users\toto" ou "/home/toto" sur des tutoriels sur internet...)
- Savoir un minimum utiliser les variables de type array (listes), dictionary (dictionnaires), string (chaines de caractères) et int (nombres). Les bool (Vrai ou faux) sont un gros plus aussi.
- if, elif, else
- Afficher du texte dans une console avec print()
Un rapide cours d'histoire
modifierLes plus de 30 ans s'en souviennent... A une certaine époque les jeux vidéos étaient très courts et on devait tout recommencer en cas de GameOver ou de pannes de piles sur sa GameBoy... Pour les jeux un peu plus long on avait des mots de passes pour éviter de recommencer depuis le début:
Arrivé au niveau 6 d'un jeu que je ne citerais pas pour ne pas dévoiler on avait le mot de passe "PBSP" qui permettait en cas de GameOver de rejouer a partir de ce même niveau 6 après arrêt de la console mais on devait a nouveau choisir "français" dans le premier écran du jeu et aller dans Options et choisir le niveau facile et rentrer le mot de passe... Une époque ou les puces de sauvegardes des cartouches de jeux était rares car chers a produire et donc réservés aux grosses licences.
Aujourd'hui n'importe quel appareil a un ou plusieurs espaces de stockage dépassant le giga que ce soit les consoles, les téléphones ou les ordinateurs.
Les sauvegardes: Ou, quand, comment, pourquoi...
modifierAvec Godot il est possible de créer des jeux et des applications sans se soucier des sauvegardes. Ce n'est pas gênant pour de petits projets ou pour donner un coté rétro a sa création mais dés qu'on souhaite faire un projet plus ambitieux les sauvegardes deviennent vite essentiels.
Elles permettent entre autre:
- L'enregistrement et la reprise de la progression du jeu
- La mémorisation des paramètres (langue, graphisme, audio...)
- La gestion des meilleurs scores
- La création et le partage de niveaux ou énigmes grâce a un éditeur que le développeur aura créé ou grâce a des fichiers textes créés grâce au bloc note de windows par exemple
- Des favoris et un historique des fichiers ouvetrs dans une application
- Et j'en passe...
Mais... On sauvegarde ou?
modifierSur le disque dur de son ordinateur ou sur la mémoire de sa console ou de son smartphone voyons... Non. Plus sérieusement on sauvegarde dans le répertoire "user://" qui est une sorte de racourcis vers un répertoire se trouvant... Ça dépend de votre système et éventuellement de quelques petits trucs que les utilisateurs expérimentés savent faire (par exemple définir manuellement l'emplacement du répertoire "user://" ou permettre a l'utilisateur de sauvegarder dans "Mes Documents" ou dans un dossier/fichier en vrac sur sa clé USB comme on le fait parfois avec son dernier dessin ou sa dernière rédaction).
Vous pouvez accéder au répertoire "user://" sur votre système simplement en allant dans le menu "Projet" et en sélectionnant "Ouvrir le dossier de donnés utilisateur".
Imaginons que L'utilisateur Estragon (Un des deux vagabonds de la pièce de théâtre "En attendant Godot") lance votre jeu "superjeu" sur son PC
Dans le cas ou il serait sous Windows les sauvegardes seraient dans
%APPDATA%\Godot\app_userdata\superjeu
Dans la majoritée des cas %APPDATA% correspond à
C:\Users\Nom_d'utilisateur\AppData\
Donc dans son cas sa sauvegarde se trouverais dans
C:\Users\Estragon\AppData\Roaming\Godot\app_userdata\superjeu\
A VERIFIER Sous macOS et Linux c'est peut-être :
macOS: ~/Library/Application Support/Godot/app_userdata/superjeu/
Linux: ~/.local/share/godot/app_userdata/superjeu/
Sur mobile ou par navigateur le cas est encore différent mais je vous laisse le soin de regarder dans la documentation officielle (il est plus que probable que pour des raisons de simplicité vous créez sur l'application pour ordinateurs).
Le plus simple c'est de tester!
modifierCréez un nouveau projet, créez une scène 2 de, node ou d'interface utilisateur et associez un script au seul node vide présent.
Les noms donnés dans les exemples:
modifierOn part du principe que:
- "Utilisateur" est le nom d'utilisateur de l'appareil
- "MonProjet" est le nom du jeu
- "MaScene" est le nom de l'unique scène du jeu
- "MonScript" est le script lié a ma scène
- "MaSauvegarde" sera le nom du fichier sans l’extension que le jeu va s'amuser a lire et écrite
- "FichierTmp" sera la variable qui servira a "dialoguer" avec un fichier temporaire et avec le fichier "MaSauvegarde"
Le plus simple: la classe ConfigFile
modifierVous avez surement déjà vu des fichiers ini ou cfg. Ils servent généralement a sauvegarder les paramètres de vos jeux et applications (comme la langue ou la qualité graphique)
Ça permet de créer une ou plusieurs sections dans lesquels on pourra écrire des variables et leurs valeurs :
[MaPremiereSection]
Texte = "Bonjour"
Nombre = 1234
[MaDeuxiemeSection]
liste=(100, "blabla")
On utilisera les méthodes suivantes :
- set_value (section, variable, valeur)
- get_value (section, variable, valeur)
- save(fichier a sauvegarder)
- load(fichier a charger)
- encode_to_text()
Et pour le fun :
- get_sections()
- get_section_keys(section)
Écrire rapidement:
modifierPour bien débuter, voici un exemple de script.
#On crée la variable
var FichierTmp = ConfigFile.new()
# La fonction _ready qui permet de lancer le script une seule fois
func _ready():
# On ecrit dans une sorte de fichier temporaire
FichierTmp.set_value ("section", "variable", "valeur")
# On sauvegarde dans un fichier txt mais n'importe quel extention peu marcher (a vérifier)
FichierTmp.save("user://MaSauvegarde.txt")
Vous pouvez tester ce bout de code dans un fichier gdscript quasi vide. Veillez toutefois a garder la ligne de code commençant par extends (la première ligne).
Chez moi elle contient :
extends Control
Un fichier "MaSauvegarde.txt" est apparut dans mon dossier
C:\Users\Utilisateur\AppData\Roaming\Godot\app_userdata\MonProjet\
Il contiens:
[section]
variable="valeur"
Une sauvegarde plus aboutie
modifierImaginons une sorte de RPG ou de Zelda-like sans inventaire qui doit sauvegarder la progression du joueur ainsi que quelques infos propre au jeu:
Le script pourrait être:
extends Control
#On crée la variable
var FichierTmp = ConfigFile.new()
# La fonction _ready qui permet de lancer le script une seule fois
func _ready():
# On ecrit dans une sorte de fichier temporaire
FichierTmp.set_value ("joueur", "vie", 50)
FichierTmp.set_value ("joueur", "score", 6000)
FichierTmp.set_value ("reglages", "plein ecran", true)
FichierTmp.set_value ("bonus", "newgameplus", "jamais terminé")
FichierTmp.set_value
# On sauvegarde
FichierTmp.save("user://MaSauvegarde.txt")
Et après lancement puis arrêt du jeu on aurais dans notre dossier utilisateur :
[joueur]
vie=50
score=6000
[reglages]
"plein ecran"=true
[bonus]
newgameplus="jamais terminé"
Le nouveau fichier remplacera l'ancien donc on ne retrouve plus la [section]"variable"="valeur" qu'on avait créé précédemment.
Il semble que la variable se contente de lire ou enregistrer dans une copie temporaire donc il faut penser a sauvegarder avec la methode save()
Il semble aussi que les fichier sont automatiquement ouverts et fermés si besoin.
C'est bien de pouvoir sauvegarder mais il est encore mieux de pouvoir recharger sa sauvegarde une fois le jeu relancé sinon ça n'a pas vraiment d'intérêts
CHARGEZ!!!
modifierPour les exemples et tests assurez-vous d'avoir le fichier "MaSauvegarde.txt" avec le contenue de l'exemple précédent et créez une nouvelle scène avec un script associé contenant:
extends Control
#On crée la variable
var FichierTmp = ConfigFile.new()
# La fonction _ready qui permet de lancer le script une seule fois
func _ready():
FichierTmp.load("user://MaSauvegarde.txt")
#--on testera ici--
On pourra changer la dernière ligne par des scripts et bouts de codes pour tester des choses.
Afficher tout le contenue du fichier
modifierOn pourrais croire qu'il suffit de faire un:
print(FichierTmp)
Mais le résultat donnera un truc du genre:
<ConfigFile#-9223372012141935357>
Heureusement il y a une méthode encode_to_text() qui donne le résultat voulut:
print(FichierTmp.encode_to_text())
Ce qui donne exactement le contenue du fichier.
Prendre seulement ce qui nous intéresse
modifierEN COURS D’ÉCRITURE. PAS TERMINÉ.