Forums GAMERGEN
[LUA] créer un système de sauvegarde
Règles du forum
Cette section reste soumise aux règles du forum, aucun contenu warez, illégal et dangereux n'est toléré.
Cette section reste soumise aux règles du forum, aucun contenu warez, illégal et dangereux n'est toléré.
Voir le premier message non lu • 6 messages
• Page 1 sur 1
[LUA] créer un système de sauvegarde
Bonjours à tous.
Je vais vous proposer un système de sauvegarde.
Pour cela, nous utiliserons un tuto existant, qui consiste à écrire dans un fichier.
Avant toute chose, je précise que j'utilise des menus sous forme d'image, et très peu de texte.
Je vais essayer de remplacer mes images par du texte pour ce tuto.
Maintenant, commençons:
LE FICHIER DE SAUVEGARDE
d'abord, on va enregistrer quelques variables
STOP: va nous servir pour vérifier certaines conditions: comme sortir du menu ou quitter le jeu
LECTURE: va déterminer le mode d'écriture dans le fichier de sauvegarde
WHITE: la couleur que l'on va utiliser pour le texte
TEXT: charge une police de font pour mettre en forme les textes.
Maintenant, on va attaquer le premier menu.
Pour déterminer ce qu'il faut, il faut ce demander comment on va présenter le menu:
On va afficher un texte qui va demander si le joueur veut sauvegarder, retourner dans le jeu, ou quitter le jeu.
Suivant la réponse, on va afficher un autre menu:
s'il veut retourner dans le jeu, il faut sortir du menu de sauvegarde sans effectuer la moindre action.
S'il veut sauvegarder, il faut alors vérifier que le fichier n'existe pas, et dans le cas contraire, demander au joueur s'il veut écrire par dessus.
S'il veut quitter le jeu, on peut alors afficher un dernier menu pour lui demander si:
il veut finalement retourner dans le jeu,
quitter complétement le jeu
simplement retourner au menu principal du jeu
Maintenant qu'on a le schéma, il va nous falloir le mettre en place.
Donc, occupons nous du premier menu:
Détaillons la boucle:
Je ne vais pas entrer en détail pour
vous devez savoir maintenant à quoi ça sert. Ni la fonction pour écrire.
Dans cette boucle nous allons attribuer différentes touches à une fonction.
oldpad = pad sert à annuler le maintient des touches. Sinon tout les menus sont passer à la vitesse de la lumière...
maintenant, on va rajouter dans la boucle, les touches que l'on utilise:
Donc, la touche X va nous faire sortir de la boucle pour ensuite afficher le menu de sauvegarde.
La touche triangle va enregistrer la valeur 1 à la variable STOP, ce qui nous fera sortir du fichier
La touche O nous fera lancer le menu nous demandant si on veut réellement sortir du jeu, retourner au menu principal ou retourner dans le jeu.
Maintenant que ce menu est terminé (c'est le plus simple il faut le dire),
nous allons nous attaquer au menu de sauvegarde.
Ce menu va vérifier si le fichier que l'on va créer existe deja ou non.
Nous afficherons alors un message d'avertissement en fonction.
Pour mon mini RPG, j'utilise le nom du héro comme nom de sauvegarde. Ainsi mon fichier de sauvegarde portera le nom du héro. Celui-ci étant demandé lors du commencement du jeu. Mais libre à vous de choisir une autre variable comme nom de sauvegarde.
Commençons par baliser notre futur menu. En mettant cette condition, nous lancerons la sauvegarde que si la variable STOP est égale a 0 (maintenant vous comprenez pourquoi je me sert de cette variable)
oldpad = pad et pad = nil va nous permettre d'annuler le maintient de la touche du menu précédent, sinon nous validerions sans même avoir eu le temps de voir le menu
maintenant, on va remplir la balise
cette condition vérifie si un fichier de sauvegarde du même nom existe deja ou non.
Si elle n'existe pas, nous lancerons directement la sauvegarde.
Sinon, nous allons afficher un menu qui va demander la confirmation de la sauvegarde, ou l'annuler.
Nous allons donc nous occuper de ce menu:
quelques explication:
Si le fichier existe, nous allons attribuer la touche X pour mettre à jour le fichier, ou O pour annuler la sauvegarde. La variable LECTURE "r+" signifie qu'on veut mettre à jour le fichier txt qui contient la sauvegarde existante.
Si l'on annule avec O nous allons changer la variable STOP pour annuler la sauvegarde et retourner dans le jeu.
Voila, maintenant que c'est fait, on va maintenant faire la sauvegarde:
Nous allons baliser la sauvegarde pour sortir si nous avions décidé de ne pas sauvegarder.
maintenant, remplissons notre balise:
io.open va nous permettre de créer le fichier de sauvegarde qui portera le nom de la variable name qui est le nom du joueur.
la variable lecture va soit mettre à jour le fichier en écrassant les données précédentes, soit tout simplement écrire dans le fichier.
file:write va nous permettre d'enregistrer dans le fichier txt.
Pour revenir à la ligne après chaque variable, pensez à mettre
maintenant, si vous voulez enregistrer du texte, il va vous falloir utiliser la syntaxe suivante:
votre_variable doit être de la forme: votre_variable = "texte"
a vous bien sur de mettre autant de file:write() que nécessaire pour sauvegarder l'intégralité des données qui seront necessaires.
Maintenant, nous allons rajouter à la suite (toujours dans notre balise et à la suite de vos file:write() ) un menu qui affichera la confirmation de la sauvegarde
voila, nous afficherons ici un message qui confirme la sauvegarde, et demandera si on veut retourner au jeu ou quitter le jeu.
On adaptera la variable STOP en fonction du choix.
Et pour finir le fichier de sauvegarde, on va faire le menu pour quitter le jeu:
comme toujours, on balise le menu
puis on rajoute la boucle:
explications:
Nous affichons un texte pour demander si le joueur souhaite réellement quitter le jeu. Nous lui donnons trois possibilités:
croix pour annuler et retourner dans le jeu,
rond pour sortir du jeu
triangle pour relancer le jeu
maintenant, un peu de ménage dans notre fichier:
Et voila! Vous venez de sauvegarder votre fichier avec un menu complet.
On va voir le code final:
FIN DU FICHIER DE SAUVEGARDE
Passons maintenant au fichier qui va lire les sauvegardes, les afficher, et nous permettre de choisir notre sauvegarde.
J'ai délibérément choisi de sauvegarder mes variables sous la forme x = y
pour charger les variables plus facilement
LE FICHIER DE CHARGEMENT
Nous voila au second fichier concernant les sauvegardes. Car avoir sauvegardé c'est bien... mais... comment récupérer ce fichier?
Nous allons faire un petit menu pour répertorier tout les fichiers et en afficher 7 par 7 avec les touches L et R qui nous permettrons de naviguer ainsi entre les fichiers.
Pour préparer ce fichier, il vous faudra faire un cadre de sélection afin de mieux encadrer le fichier que l'on désir.
nous allons commencer notre fichier en enregistrant quelques variables
je vous le conseil si jamais vous aviez une musique qui tourne, car afficher plein de texte sur l'ecran risque de transformer votre musique en quelque chose de méconnaissable.
c'est le cadre de sélection que l'on placera autour des différents fichier
on charge une police de font ainsi que la couleur du texte
passage important!
On stock dans une table tous les fichiers dans le répertoire sauvegarde/
puis, on enregistre dans une autre variable le nombre total de fichiers contenus dans la table
quelques variables pour naviguer dans le menu des sauvegardes
Important!! Nous commencerons à afficher les sauvegardes contenues dans la table qu'à partir du 3eme fichier de la table.
Pourquoi?? parce que les 2 premiers fichiers dans la table sont "./" et "../"
Ne vous demandez pas d'où ils sortent, il en est toujours ainsi, prenez donc l'habitude de commencer par la 3eme donnée de la table.
Par défaut, on va attribuer un texte vide aux lignes de texte que l'on va utiliser. Vous avez compris, nous afficherons nos sauvegarde, 7 par 7, la 8eme ligne servira à signaler qu'il y a plusieurs pages (car plus de 7 sauvegardes)
Si le nombre de fichiers dans la table dépassent 9 on signal que l'on peut changer de page avec L et R
Pourquoi 9? Parce que si vous m'avez écoutés, les 2 premières données de la table sont "./" et "../"
hors donc, nous ne les afficherons pas, il faut donc rajouter 2 a 7, et 2 + 7 ça donne 9!!
:*go*
Bon, et pour finir les variables, voici
Ces deux variables sont a définir selon votre cadre de selection, le mien faisant 432 x 37 pixels, le point de départ pour etre correctement cadré avec l'affichage des sauvegardes sont ses valeurs.
Voila, on va maintenant s'attaquer au plus dur *diabolo*
on commence par une boucle
Quelques explications:
nous allons afficher les 8 lignes sur l'ecran.
Chaque ligne étant vide au départ, elles seront remplit si possible
puis nous affichons le cadre de selection des sauvegardes sur le premier emplacement
maintenant, on va modifier les lignes SI cela est possible
Explications:
On fait une table pour charger le bon fichier en fonction de la position du cadre de selection.
Si la ligne1 est vide ( "" ), que la variable compter est égale à 1 (et donc, qu'il y a encore des fichiers à afficher) et que le nombre de fichiers dans la table des sauvegardes dépasse 2 (vous savez pourquoi maintenant non? C'est parce que les 2 premiers fichiers dans la table ne sont "./" et "../"), alors nous allons modifier la ligne1 avec la sauvegarde qui correspond au fichier [i], et nous enregistons également ce fichier dans une variable qui correspond à la ligne en question pour ne pas ce mélanger les pédales.
Une fois les lignes check et modifiées si necessaire, on va rajouter 1 a la variable i qui nous permettra alors de prendre la valeur suivante dans la table. Nous vérifirons au préalable que cette variable i est toujours inférieure au total des sauvegardes contenus dans la table. Si jamais on arrivait au total, on arrêterait alors de check les lignes en modifiant la variable compter.
Maintenant que l'on c'est occupé des lignes qui afficherons les sauvegardes, nous allons nous occuper de la navigation.
on va commencer par les touches de base, puis par les touches de navigation
Explications:
La touche O sera utilisée pour quitter le menu de chargement
La touche BAS (si nous ne sommes pas sur la dernière ligne des sauvegardes, soit la 7eme ligne) rajoutera 20 a la variable yy, ce qui fera descendre le cadre de selection. 20 est la valeur qui chez moi correspond au pas de déplacement pour passer d'une ligne à l'autre. Cette valeur sera peu etre a pofiner en fonction de votre taille de texte
nous oublierons pas d'ajouter 1 a la variable position pour indiquer qu'on passe a la ligne du dessous
la touche HAUT est du meme acabit. simplement, on vérifie avant que nous ne sommes pas sur la premiere ligne.
La touche X va confirmer le choix de la sauvegarde, cependant, il faudra vérifier que le cadre est sur une sauvegarde (parce que si vous avez qu'un seul fichier, vous pouvez quand meme descendre de 7 lignes, les 6 autres lignes sont donc vide et il faut le prendre en compte)
Maintenant, on va mettre à la suite la navigation.
On n'a pas fermé notre if parce que c'est pas fini, je sépare juste pour ne pas tout balancer en une seule fois.
On commence par la touche L. Cette touche nous sera revenir d'une page.
Nous allons donc retrancher 1 à la variable page. Puis nous allons calculer i pour afficher les bonnes sauvegardes en fonction de la page. Soit 3 (parce que les 2 premieres données de la table nous concerne pas) + la page * 7 car on affiche 7 sauvegardes par page et on enleve 7 pour afficher la premiere sauvegarde de la page.
Ex: on a 16 sauvegardes. Donc, 3 pages. Si on est à la page 3 et qu'on retourne en arrière, nous aurons normalement la 8eme sauvegarde en premiere ligne et la 14eme sauvegarde en derniere ligne
soit: 3 + 2*7 - 7 = 3 + 14 - 7 = 10
on est donc bon! (encore une fois, les 2 premiers fichiers ne nous concerne pas, donc, 10 - 2 = 8, nous afficherons donc bien la 8eme sauvegarde sur la premiere ligne.
ensuite, nous remettons le curseur sur la premiere ligne, et n'oublions pas de remettre la variable compter en état sinon nos lignes ne seront pas remplit. J'efface aussi les lignes 1 à 7 pour indiquer à mon code de les remplir à nouveau.
Comme nous avons reculé d'une page, il n'est pas necessaire de vérifier s'il existe plus de sauvegardes que de ligne, car c'est logique. La 8eme ligne est donc remplie sans condition.
Maintenant, on va passer à la touche R qui va aller a la page suivante.
idem, mais on rajoute 1 page, et on recalcul i pour afficher la sauvegarde suivante
i = 3+7*(page-1)
dans l'exemple précédent, si l'on part de la page 2
nous aurions:
3 + 7*2 = 3 + 14 = 17
on est rebon!! on affichera bien la 15eme sauvegarde à la page 3
nous supprimons les lignes 1 a 7 et nous verifions bien que la ligne 8 doit etre affiché ou non.
et maintenant, le bouquet final!
une simple formalité!
on va ouvrir le fichier et récupérer les données
explications:
si on a selectionné une sauvegarde, on va alors charger le fichier que l'on a choisi. D'ou l'interet d'enregistrer notre sauvegarde sous la forme: X = Y
ainsi toutes les variables sont chargées.
Dans mon exemple je charge 2 variables dans une table etat, mais c'est à vous de gérer vos variables de sauvegarde comme il vous plaira.
ensuite, toujours dans mon exemple, mes fichiers sauvegarde comportent une variable appelée save_choix. Cette variable va me permettre d'ouvrir le fichier du jeu ou le joueur a sauvegarder.
mais la, cela depend encore une fois de vous, avec un RPG, il est interessant d'enregistrer une variable qui vous permettra de savoir ou le personnage se trouvait, comme le nom d'une ville, d'un lieu, ou tout autre chose. Ensuite, si la variable s'appel 'Aden" vous chargez le fichier lua qui correspond à l'endroit, etc etc.
le code tout entier:
nous allons terminer ce tuto avec des aperçus
bonne chance!
Je vais vous proposer un système de sauvegarde.
Pour cela, nous utiliserons un tuto existant, qui consiste à écrire dans un fichier.
Avant toute chose, je précise que j'utilise des menus sous forme d'image, et très peu de texte.
Je vais essayer de remplacer mes images par du texte pour ce tuto.
Maintenant, commençons:
LE FICHIER DE SAUVEGARDE
d'abord, on va enregistrer quelques variables
- Code: Select All Code
stop = 0
lecture = "w"
white = Color.new(255,255,255)
text = Font.load("text.ttf")
text:setPixelSizes(0, 20)
STOP: va nous servir pour vérifier certaines conditions: comme sortir du menu ou quitter le jeu
LECTURE: va déterminer le mode d'écriture dans le fichier de sauvegarde
WHITE: la couleur que l'on va utiliser pour le texte
TEXT: charge une police de font pour mettre en forme les textes.
Maintenant, on va attaquer le premier menu.
Pour déterminer ce qu'il faut, il faut ce demander comment on va présenter le menu:
On va afficher un texte qui va demander si le joueur veut sauvegarder, retourner dans le jeu, ou quitter le jeu.
Suivant la réponse, on va afficher un autre menu:
s'il veut retourner dans le jeu, il faut sortir du menu de sauvegarde sans effectuer la moindre action.
S'il veut sauvegarder, il faut alors vérifier que le fichier n'existe pas, et dans le cas contraire, demander au joueur s'il veut écrire par dessus.
S'il veut quitter le jeu, on peut alors afficher un dernier menu pour lui demander si:
il veut finalement retourner dans le jeu,
quitter complétement le jeu
simplement retourner au menu principal du jeu
Maintenant qu'on a le schéma, il va nous falloir le mettre en place.
Donc, occupons nous du premier menu:
- Code: Select All Code
while true do
screen:clear()
screen:fontPrint(text,20,20," X POUR SAUVEGARDER ",white)
screen:fontPrint(text,20,50," O POUR QUITTER LE JEU ",white)
screen:fontPrint(text,20,80," TRIANGLE ANNULER ",white)
pad = Controls.read()
--on va mettre ici la suite
screen.waitVblankStart()
screen.flip()
oldpad = pad
end
Détaillons la boucle:
Je ne vais pas entrer en détail pour
- Code: Select All Code
screen.waitVblankStart()
screen.flip()
vous devez savoir maintenant à quoi ça sert. Ni la fonction pour écrire.
Dans cette boucle nous allons attribuer différentes touches à une fonction.
oldpad = pad sert à annuler le maintient des touches. Sinon tout les menus sont passer à la vitesse de la lumière...
maintenant, on va rajouter dans la boucle, les touches que l'on utilise:
- Code: Select All Code
if pad:cross() and oldpad:cross() ~= pad:cross() then
break
elseif pad:triangle() and oldpad:triangle() ~= pad:triangle() then
stop = 1
break
elseif pad:circle() and oldpad:circle() ~= pad:circle() then
stop = 2
break
end
if pad:select() then
screen:save("screenshot/screen"..sccnt..".png")
sccnt=sccnt+1
end
Donc, la touche X va nous faire sortir de la boucle pour ensuite afficher le menu de sauvegarde.
La touche triangle va enregistrer la valeur 1 à la variable STOP, ce qui nous fera sortir du fichier
La touche O nous fera lancer le menu nous demandant si on veut réellement sortir du jeu, retourner au menu principal ou retourner dans le jeu.
Maintenant que ce menu est terminé (c'est le plus simple il faut le dire),
nous allons nous attaquer au menu de sauvegarde.
Ce menu va vérifier si le fichier que l'on va créer existe deja ou non.
Nous afficherons alors un message d'avertissement en fonction.
Pour mon mini RPG, j'utilise le nom du héro comme nom de sauvegarde. Ainsi mon fichier de sauvegarde portera le nom du héro. Celui-ci étant demandé lors du commencement du jeu. Mais libre à vous de choisir une autre variable comme nom de sauvegarde.
- Code: Select All Code
if stop == 0 then
oldpad = pad
pad = nil
--on va mettre ici la suite
end
Commençons par baliser notre futur menu. En mettant cette condition, nous lancerons la sauvegarde que si la variable STOP est égale a 0 (maintenant vous comprenez pourquoi je me sert de cette variable)
oldpad = pad et pad = nil va nous permettre d'annuler le maintient de la touche du menu précédent, sinon nous validerions sans même avoir eu le temps de voir le menu
maintenant, on va remplir la balise
- Code: Select All Code
if io.open("sauvegarde/"..name..".txt", "r") ~= nil then
-- on va mettre ici la suite
end
cette condition vérifie si un fichier de sauvegarde du même nom existe deja ou non.
Si elle n'existe pas, nous lancerons directement la sauvegarde.
Sinon, nous allons afficher un menu qui va demander la confirmation de la sauvegarde, ou l'annuler.
Nous allons donc nous occuper de ce menu:
- Code: Select All Code
while true do
screen:clear()
screen:fontPrint(text,20,20," FICHIER DEJA EXISTANT ",white)
screen:fontPrint(text,20,50," X REMPLACER / O ANNULER ",white)
pad = Controls.read()
if pad:cross() and oldpad:cross() ~= pad:cross() then
lecture = "r+"
break
elseif pad:circle() and oldpad:circle() ~= pad:circle() then
stop = 1
break
end
screen.waitVblankStart()
screen.flip()
oldpad = pad
end
quelques explication:
Si le fichier existe, nous allons attribuer la touche X pour mettre à jour le fichier, ou O pour annuler la sauvegarde. La variable LECTURE "r+" signifie qu'on veut mettre à jour le fichier txt qui contient la sauvegarde existante.
Si l'on annule avec O nous allons changer la variable STOP pour annuler la sauvegarde et retourner dans le jeu.
Voila, maintenant que c'est fait, on va maintenant faire la sauvegarde:
- Code: Select All Code
if stop == 0 then
oldpad = pad
pad = nil
--on va mettre la suite ici
end
Nous allons baliser la sauvegarde pour sortir si nous avions décidé de ne pas sauvegarder.
maintenant, remplissons notre balise:
- Code: Select All Code
file = io.open("sauvegarde/"..name..".txt",lecture)
file:write("name = \""..name.."\"") -- pour sauvegarder du text
file:write("\nsave_choix = "..save_choix) -- pour sauvegarder une valeur
file:close()
io.open va nous permettre de créer le fichier de sauvegarde qui portera le nom de la variable name qui est le nom du joueur.
la variable lecture va soit mettre à jour le fichier en écrassant les données précédentes, soit tout simplement écrire dans le fichier.
file:write va nous permettre d'enregistrer dans le fichier txt.
Pour revenir à la ligne après chaque variable, pensez à mettre
- Code: Select All Code
\n
maintenant, si vous voulez enregistrer du texte, il va vous falloir utiliser la syntaxe suivante:
- Code: Select All Code
file:write("name = \""..votre_variable.."\"")
votre_variable doit être de la forme: votre_variable = "texte"
a vous bien sur de mettre autant de file:write() que nécessaire pour sauvegarder l'intégralité des données qui seront necessaires.
Maintenant, nous allons rajouter à la suite (toujours dans notre balise et à la suite de vos file:write() ) un menu qui affichera la confirmation de la sauvegarde
- Code: Select All Code
while true do
screen:clear()
pad = Controls.read()
screen:fontPrint(text,130,100,"SAUVEGARDE TERMINEE",white)
screen:fontPrint(text,130,130,"Nom fichier: "..name,white)
screen:fontPrint(text,70,160,"X RETOUR / O QUITTER LE JEU",white)
if pad:cross() and oldpad:cross() ~= pad:cross() then
stop = 1
break
elseif pad:circle() and oldpad:circle() ~= pad:circle() then
stop = 2
break
end
screen.waitVblankStart()
screen.flip()
oldpad = pad
end
voila, nous afficherons ici un message qui confirme la sauvegarde, et demandera si on veut retourner au jeu ou quitter le jeu.
On adaptera la variable STOP en fonction du choix.
Et pour finir le fichier de sauvegarde, on va faire le menu pour quitter le jeu:
- Code: Select All Code
if stop == 2 then
oldpad = pad
pad = nil
--on mettra la suite ici
end
comme toujours, on balise le menu
puis on rajoute la boucle:
- Code: Select All Code
while true do
screen:clear()
screen:fontPrint(text,130,100,"Quitter le jeu?",white)
screen:fontPrint(text,130,130,"X annuler / O quitter le jeu",white)
screen:fontPrint(text,70,160,"TRIANGLE retour au menu principal",white)
pad = Controls.read()
if pad:cross() and oldpad:cross() ~= pad:cross() then
break
elseif pad:triangle() and oldpad:triangle() ~= pad:triangle() then
dofile("script.lua")
break
elseif pad:circle() and oldpad:circle() ~= pad:circle() then
os.exit()
end
screen.waitVblankStart()
screen.flip()
oldpad = pad
end
explications:
Nous affichons un texte pour demander si le joueur souhaite réellement quitter le jeu. Nous lui donnons trois possibilités:
croix pour annuler et retourner dans le jeu,
rond pour sortir du jeu
triangle pour relancer le jeu
maintenant, un peu de ménage dans notre fichier:
- Code: Select All Code
file = nil
stop = nil
lecture = nil
Et voila! Vous venez de sauvegarder votre fichier avec un menu complet.
On va voir le code final:
- Code: Select All Code
stop = 0
lecture = "w"
white = Color.new(255,255,255)
text = Font.load("text.ttf")
text:setPixelSizes(0, 20)
while true do
screen:clear()
screen:fontPrint(text,20,20," X POUR SAUVEGARDER ",white)
screen:fontPrint(text,20,50," O POUR QUITTER LE JEU ",white)
screen:fontPrint(text,20,80," TRIANGLE ANNULER ",white)
pad = Controls.read()
if pad:cross() and oldpad:cross() ~= pad:cross() then
break
elseif pad:triangle() and oldpad:triangle() ~= pad:triangle() then
stop = 1
break
elseif pad:circle() and oldpad:circle() ~= pad:circle() then
stop = 2
break
end
if pad:select() then
screen:save("screenshot/screen"..sccnt..".png")
sccnt=sccnt+1
end
screen.waitVblankStart()
screen.flip()
oldpad = pad
end
if stop == 0 then
oldpad = pad
pad = nil
if io.open("sauvegarde/"..name..".txt", "r") ~= nil then
while true do
screen:clear()
screen:fontPrint(text,20,20," FICHIER DEJA EXISTANT ",white)
screen:fontPrint(text,20,50," X REMPLACER / O ANNULER ",white)
pad = Controls.read()
if pad:cross() and oldpad:cross() ~= pad:cross() then
lecture = "r+"
break
elseif pad:circle() and oldpad:circle() ~= pad:circle() then
stop = 1
break
end
screen.waitVblankStart()
screen.flip()
oldpad = pad
end
end
end
if stop == 0 then
oldpad = pad
pad = nil
file = io.open("sauvegarde/"..name..".txt",lecture)
file:write("name = \""..name.."\"") -- pour sauvegarder du text
file:write("\nsave_choix = "..save_choix) -- pour sauvegarder une valeur
file:close()
while true do
screen:clear()
pad = Controls.read()
screen:fontPrint(text,130,100,"SAUVEGARDE TERMINEE",white)
screen:fontPrint(text,130,130,"Nom fichier: "..name,white)
screen:fontPrint(text,70,160,"X RETOUR / O QUITTER LE JEU",white)
if pad:cross() and oldpad:cross() ~= pad:cross() then
stop = 1
break
elseif pad:circle() and oldpad:circle() ~= pad:circle() then
stop = 2
break
end
screen.waitVblankStart()
screen.flip()
oldpad = pad
end
end
if stop == 2 then
oldpad = pad
pad = nil
while true do
screen:clear()
screen:fontPrint(text,130,100,"Quitter le jeu?",white)
screen:fontPrint(text,130,130,"X annuler / O quitter le jeu",white)
screen:fontPrint(text,70,160,"TRIANGLE retour au menu principal",white)
pad = Controls.read()
if pad:cross() and oldpad:cross() ~= pad:cross() then
break
elseif pad:triangle() and oldpad:triangle() ~= pad:triangle() then
dofile("script.lua")
break
elseif pad:circle() and oldpad:circle() ~= pad:circle() then
os.exit()
end
screen.waitVblankStart()
screen.flip()
oldpad = pad
end
end
file = nil
stop = nil
lecture = nil
FIN DU FICHIER DE SAUVEGARDE
Passons maintenant au fichier qui va lire les sauvegardes, les afficher, et nous permettre de choisir notre sauvegarde.
J'ai délibérément choisi de sauvegarder mes variables sous la forme x = y
pour charger les variables plus facilement
LE FICHIER DE CHARGEMENT
Nous voila au second fichier concernant les sauvegardes. Car avoir sauvegardé c'est bien... mais... comment récupérer ce fichier?
Nous allons faire un petit menu pour répertorier tout les fichiers et en afficher 7 par 7 avec les touches L et R qui nous permettrons de naviguer ainsi entre les fichiers.
Pour préparer ce fichier, il vous faudra faire un cadre de sélection afin de mieux encadrer le fichier que l'on désir.
nous allons commencer notre fichier en enregistrant quelques variables
- Code: Select All Code
Music.stop()
je vous le conseil si jamais vous aviez une musique qui tourne, car afficher plein de texte sur l'ecran risque de transformer votre musique en quelque chose de méconnaissable.
- Code: Select All Code
cartouche = Image.load("images/cartouche.png")
c'est le cadre de sélection que l'on placera autour des différents fichier
- Code: Select All Code
text = Font.load("text.ttf")
text:setPixelSizes(0, 20)
white = Color.new(255,255,255)
on charge une police de font ainsi que la couleur du texte
- Code: Select All Code
fichiers = System.listDirectory("sauvegarde/")
n_fichiers = table.getn(fichiers)
passage important!
On stock dans une table tous les fichiers dans le répertoire sauvegarde/
puis, on enregistre dans une autre variable le nombre total de fichiers contenus dans la table
- Code: Select All Code
position = 1
compter = 1
charger = 0
page = 1
quelques variables pour naviguer dans le menu des sauvegardes
- Code: Select All Code
i = 3
Important!! Nous commencerons à afficher les sauvegardes contenues dans la table qu'à partir du 3eme fichier de la table.
Pourquoi?? parce que les 2 premiers fichiers dans la table sont "./" et "../"
Ne vous demandez pas d'où ils sortent, il en est toujours ainsi, prenez donc l'habitude de commencer par la 3eme donnée de la table.
- Code: Select All Code
ligne1 = ""
ligne2 = ""
ligne3 = ""
ligne4 = ""
ligne5 = ""
ligne6 = ""
ligne7 = ""
Par défaut, on va attribuer un texte vide aux lignes de texte que l'on va utiliser. Vous avez compris, nous afficherons nos sauvegarde, 7 par 7, la 8eme ligne servira à signaler qu'il y a plusieurs pages (car plus de 7 sauvegardes)
- Code: Select All Code
if n_fichiers > 9 then
ligne8 = "L : Back -- R : Next"
else
ligne8 = ""
end
Si le nombre de fichiers dans la table dépassent 9 on signal que l'on peut changer de page avec L et R
Pourquoi 9? Parce que si vous m'avez écoutés, les 2 premières données de la table sont "./" et "../"
hors donc, nous ne les afficherons pas, il faut donc rajouter 2 a 7, et 2 + 7 ça donne 9!!
:*go*
Bon, et pour finir les variables, voici
- Code: Select All Code
xx = 30
yy = 66
Ces deux variables sont a définir selon votre cadre de selection, le mien faisant 432 x 37 pixels, le point de départ pour etre correctement cadré avec l'affichage des sauvegardes sont ses valeurs.
Voila, on va maintenant s'attaquer au plus dur *diabolo*
on commence par une boucle
- Code: Select All Code
while true do
screen:clear()
pad = Controls.read()
screen:fontPrint(text,50,90,ligne1,white)
screen:fontPrint(text,50,110,ligne2,white)
screen:fontPrint(text,50,130,ligne3,white)
screen:fontPrint(text,50,150,ligne4,white)
screen:fontPrint(text,50,170,ligne5,white)
screen:fontPrint(text,50,190,ligne6,white)
screen:fontPrint(text,50,210,ligne7,white)
screen:fontPrint(text,50,230,ligne8,white)
screen:blit(xx,yy,cartouche)
--on mettra la suite ici
screen.waitVblankStart()
screen.flip()
oldpad = pad
end
Quelques explications:
nous allons afficher les 8 lignes sur l'ecran.
Chaque ligne étant vide au départ, elles seront remplit si possible
puis nous affichons le cadre de selection des sauvegardes sur le premier emplacement
maintenant, on va modifier les lignes SI cela est possible
- Code: Select All Code
fichier = {fichier1, fichier2, fichier3, fichier4, fichier5, fichier6, fichier7}
if ligne1 == "" and compter == 1 and n_fichiers > 2 then
ligne1 = "fichier 1 : "..fichiers[i].name
fichier1 = fichiers[i].name
elseif ligne2 == "" and compter == 1 and n_fichiers > 2 then
ligne2 = "fichier 2 : "..fichiers[i].name
fichier2 = fichiers[i].name
elseif ligne3 == "" and compter == 1 and n_fichiers > 2 then
ligne3 = "fichier 3 : "..fichiers[i].name
fichier3 = fichiers[i].name
elseif ligne4 == "" and compter == 1 and n_fichiers > 2 then
ligne4 = "fichier 4 : "..fichiers[i].name
fichier4 = fichiers[i].name
elseif ligne5 == "" and compter == 1 and n_fichiers > 2 then
ligne5 = "fichier 5 : "..fichiers[i].name
fichier5 = fichiers[i].name
elseif ligne6 == "" and compter == 1 and n_fichiers > 2 then
ligne6 = "fichier 6 : "..fichiers[i].name
fichier6 = fichiers[i].name
elseif ligne7 == "" and compter == 1 and n_fichiers > 2 then
ligne7 = "fichier 7 : "..fichiers[i].name
fichier7 = fichiers[i].name
end
if n_fichiers > i then
i = i + 1
else
compter = 0
end
Explications:
On fait une table pour charger le bon fichier en fonction de la position du cadre de selection.
Si la ligne1 est vide ( "" ), que la variable compter est égale à 1 (et donc, qu'il y a encore des fichiers à afficher) et que le nombre de fichiers dans la table des sauvegardes dépasse 2 (vous savez pourquoi maintenant non? C'est parce que les 2 premiers fichiers dans la table ne sont "./" et "../"), alors nous allons modifier la ligne1 avec la sauvegarde qui correspond au fichier [i], et nous enregistons également ce fichier dans une variable qui correspond à la ligne en question pour ne pas ce mélanger les pédales.
Une fois les lignes check et modifiées si necessaire, on va rajouter 1 a la variable i qui nous permettra alors de prendre la valeur suivante dans la table. Nous vérifirons au préalable que cette variable i est toujours inférieure au total des sauvegardes contenus dans la table. Si jamais on arrivait au total, on arrêterait alors de check les lignes en modifiant la variable compter.
Maintenant que l'on c'est occupé des lignes qui afficherons les sauvegardes, nous allons nous occuper de la navigation.
on va commencer par les touches de base, puis par les touches de navigation
- Code: Select All Code
if pad:circle() and oldpad:circle() ~= pad:circle() then
break
elseif pad:down() and oldpad:down() ~= pad:down() and position < 7 then
position = position + 1
yy = yy + 20
elseif pad:up() and oldpad:up() ~= pad:up() and position > 1 then
position = position - 1
yy = yy - 20
elseif pad:cross() and oldpad:cross() ~= pad:cross() then
charger = fichier[position]
if charger ~= nil then
break
end
--on mettra la suite ici
Explications:
La touche O sera utilisée pour quitter le menu de chargement
La touche BAS (si nous ne sommes pas sur la dernière ligne des sauvegardes, soit la 7eme ligne) rajoutera 20 a la variable yy, ce qui fera descendre le cadre de selection. 20 est la valeur qui chez moi correspond au pas de déplacement pour passer d'une ligne à l'autre. Cette valeur sera peu etre a pofiner en fonction de votre taille de texte
nous oublierons pas d'ajouter 1 a la variable position pour indiquer qu'on passe a la ligne du dessous
la touche HAUT est du meme acabit. simplement, on vérifie avant que nous ne sommes pas sur la premiere ligne.
La touche X va confirmer le choix de la sauvegarde, cependant, il faudra vérifier que le cadre est sur une sauvegarde (parce que si vous avez qu'un seul fichier, vous pouvez quand meme descendre de 7 lignes, les 6 autres lignes sont donc vide et il faut le prendre en compte)
Maintenant, on va mettre à la suite la navigation.
On n'a pas fermé notre if parce que c'est pas fini, je sépare juste pour ne pas tout balancer en une seule fois.
- Code: Select All Code
elseif pad:l() and oldpad:l() ~= pad:l() and page > 1 then
page = page - 1
i = 3 + page * 7 - 7
position = 1
compter = 1
yy = 66
ligne1 = ""
ligne2 = ""
ligne3 = ""
ligne4 = ""
ligne5 = ""
ligne6 = ""
ligne7 = ""
ligne8 = "L : Back -- R : Next"
On commence par la touche L. Cette touche nous sera revenir d'une page.
Nous allons donc retrancher 1 à la variable page. Puis nous allons calculer i pour afficher les bonnes sauvegardes en fonction de la page. Soit 3 (parce que les 2 premieres données de la table nous concerne pas) + la page * 7 car on affiche 7 sauvegardes par page et on enleve 7 pour afficher la premiere sauvegarde de la page.
Ex: on a 16 sauvegardes. Donc, 3 pages. Si on est à la page 3 et qu'on retourne en arrière, nous aurons normalement la 8eme sauvegarde en premiere ligne et la 14eme sauvegarde en derniere ligne
soit: 3 + 2*7 - 7 = 3 + 14 - 7 = 10
on est donc bon! (encore une fois, les 2 premiers fichiers ne nous concerne pas, donc, 10 - 2 = 8, nous afficherons donc bien la 8eme sauvegarde sur la premiere ligne.
ensuite, nous remettons le curseur sur la premiere ligne, et n'oublions pas de remettre la variable compter en état sinon nos lignes ne seront pas remplit. J'efface aussi les lignes 1 à 7 pour indiquer à mon code de les remplir à nouveau.
Comme nous avons reculé d'une page, il n'est pas necessaire de vérifier s'il existe plus de sauvegardes que de ligne, car c'est logique. La 8eme ligne est donc remplie sans condition.
Maintenant, on va passer à la touche R qui va aller a la page suivante.
- Code: Select All Code
elseif pad:r() and oldpad:r() ~= pad:r() and ligne8 == "L : Back -- R : Next" then
page = page + 1
i = 3+7*(page-1)
position = 1
compter = 1
yy = 66
ligne1 = ""
ligne2 = ""
ligne3 = ""
ligne4 = ""
ligne5 = ""
ligne6 = ""
ligne7 = ""
if n_fichiers-7 > i then
ligne8 = "L : Back -- R : Next"
else
ligne8 = ""
end
end
idem, mais on rajoute 1 page, et on recalcul i pour afficher la sauvegarde suivante
i = 3+7*(page-1)
dans l'exemple précédent, si l'on part de la page 2
nous aurions:
3 + 7*2 = 3 + 14 = 17
on est rebon!! on affichera bien la 15eme sauvegarde à la page 3
nous supprimons les lignes 1 a 7 et nous verifions bien que la ligne 8 doit etre affiché ou non.
et maintenant, le bouquet final!
une simple formalité!
on va ouvrir le fichier et récupérer les données
- Code: Select All Code
oldpad = pad
if charger ~= 0 then
dofile("sauvegarde/"..charger)
etat[jeu_joueur] = {hp=hp,conshp = conshp}
if save_choix == 1 then
dofile("dj/choix01.lua")
end
end
explications:
si on a selectionné une sauvegarde, on va alors charger le fichier que l'on a choisi. D'ou l'interet d'enregistrer notre sauvegarde sous la forme: X = Y
ainsi toutes les variables sont chargées.
Dans mon exemple je charge 2 variables dans une table etat, mais c'est à vous de gérer vos variables de sauvegarde comme il vous plaira.
ensuite, toujours dans mon exemple, mes fichiers sauvegarde comportent une variable appelée save_choix. Cette variable va me permettre d'ouvrir le fichier du jeu ou le joueur a sauvegarder.
mais la, cela depend encore une fois de vous, avec un RPG, il est interessant d'enregistrer une variable qui vous permettra de savoir ou le personnage se trouvait, comme le nom d'une ville, d'un lieu, ou tout autre chose. Ensuite, si la variable s'appel 'Aden" vous chargez le fichier lua qui correspond à l'endroit, etc etc.
le code tout entier:
- Code: Select All Code
Music.stop()
cartouche = Image.load("images/cartouche.png")
text = Font.load("text.ttf")
text:setPixelSizes(0, 20)
white = Color.new(255,255,255)
fichiers = System.listDirectory("sauvegarde/")
n_fichiers = table.getn(fichiers)
position = 1
compter = 1
charger = 0
page = 1
i = 3
ligne1 = ""
ligne2 = ""
ligne3 = ""
ligne4 = ""
ligne5 = ""
ligne6 = ""
ligne7 = ""
if n_fichiers > 9 then
ligne8 = "L : Back -- R : Next"
else
ligne8 = ""
end
xx = 30
yy = 66
while true do
screen:clear()
pad = Controls.read()
screen:fontPrint(text,50,90,ligne1,white)
screen:fontPrint(text,50,110,ligne2,white)
screen:fontPrint(text,50,130,ligne3,white)
screen:fontPrint(text,50,150,ligne4,white)
screen:fontPrint(text,50,170,ligne5,white)
screen:fontPrint(text,50,190,ligne6,white)
screen:fontPrint(text,50,210,ligne7,white)
screen:fontPrint(text,50,230,ligne8,white)
screen:blit(xx,yy,cartouche)
fichier = {fichier1, fichier2, fichier3, fichier4, fichier5, fichier6, fichier7}
if ligne1 == "" and compter == 1 and n_fichiers > 2 then
ligne1 = "fichier 1 : "..fichiers[i].name
fichier1 = fichiers[i].name
elseif ligne2 == "" and compter == 1 and n_fichiers > 2 then
ligne2 = "fichier 2 : "..fichiers[i].name
fichier2 = fichiers[i].name
elseif ligne3 == "" and compter == 1 and n_fichiers > 2 then
ligne3 = "fichier 3 : "..fichiers[i].name
fichier3 = fichiers[i].name
elseif ligne4 == "" and compter == 1 and n_fichiers > 2 then
ligne4 = "fichier 4 : "..fichiers[i].name
fichier4 = fichiers[i].name
elseif ligne5 == "" and compter == 1 and n_fichiers > 2 then
ligne5 = "fichier 5 : "..fichiers[i].name
fichier5 = fichiers[i].name
elseif ligne6 == "" and compter == 1 and n_fichiers > 2 then
ligne6 = "fichier 6 : "..fichiers[i].name
fichier6 = fichiers[i].name
elseif ligne7 == "" and compter == 1 and n_fichiers > 2 then
ligne7 = "fichier 7 : "..fichiers[i].name
fichier7 = fichiers[i].name
end
if n_fichiers > i then
i = i + 1
else
compter = 0
end
if pad:select() then
screen:save("screenshot/screen"..sccnt..".png")
sccnt=sccnt+1
end
if pad:circle() and oldpad:circle() ~= pad:circle() then
break
elseif pad:down() and oldpad:down() ~= pad:down() and position < 7 then
position = position + 1
yy = yy + 20
elseif pad:up() and oldpad:up() ~= pad:up() and position > 1 then
position = position - 1
yy = yy - 20
elseif pad:cross() and oldpad:cross() ~= pad:cross() then
charger = fichier[position]
if charger ~= nil then
break
end
elseif pad:l() and oldpad:l() ~= pad:l() and page > 1 then
page = page - 1
i = 3 + page * 7 - 7
position = 1
compter = 1
yy = 66
ligne1 = ""
ligne2 = ""
ligne3 = ""
ligne4 = ""
ligne5 = ""
ligne6 = ""
ligne7 = ""
ligne8 = "L : Back -- R : Next"
elseif pad:r() and oldpad:r() ~= pad:r() and ligne8 == "L : Back -- R : Next" then
page = page + 1
i = 3+7*(page-1)
position = 1
compter = 1
yy = 66
ligne1 = ""
ligne2 = ""
ligne3 = ""
ligne4 = ""
ligne5 = ""
ligne6 = ""
ligne7 = ""
if n_fichiers-7 > i then
ligne8 = "L : Back -- R : Next"
else
ligne8 = ""
end
end
screen.waitVblankStart()
screen.flip()
oldpad = pad
end
oldpad = pad
if charger ~= 0 then
dofile("sauvegarde/"..charger)
etat[jeu_joueur] = {hp=hp,conshp = conshp}
if save_choix == 1 then
dofile("dj/choix01.lua")
end
end
nous allons terminer ce tuto avec des aperçus
bonne chance!
-
Darknessneo
Gamer Pro
- Messages: 210
- Inscription: 08 Déc 2008, 20:56
- Pays: France
- Sexe: Homme
Re: [LUA] créer un système de sauvegarde
Le tuto de ouf !!!
Je n'imagine meme pas le temps que tu a du y mettre.
Franchement BRAVO
Je n'imagine meme pas le temps que tu a du y mettre.
Franchement BRAVO
-
jiospike94
Gamer Hardcore
- Messages: 715
- Inscription: 14 Mai 2011, 16:12
- Localisation: Val-de-Marne (94)
- Pays: France
- Sexe: Homme
6 messages
• Page 1 sur 1