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é.

[LUA] créer un système de sauvegarde

Message non lupar Darknessneo » 25 Mar 2008, 19:49

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
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
Image

Image

Image

Image

Image

bonne chance!
Darknessneo Gamer Pro
Gamer Pro
Messages: 210
Inscription: 08 Déc 2008, 20:56
Pays: France
Sexe: Homme

Message non lupar Fylyp » 25 Mar 2008, 21:41

8O waou 8O
Ca c'est du tuto!!! Franchement felicitation! Je vais tester ça ce soir
Merci beaucoup
Fylyp Gamer Maitre
Gamer Maitre
Messages: 269
Inscription: 29 Juil 2010, 16:59
Pays: France

Message non lupar lefoux » 07 Avr 2008, 20:50

Waouw !!!
cool merci !
Avatar de l’utilisateur lefoux

Message non lupar izi94 » 09 Avr 2008, 15:52

:o

Beaucoup trop long pour moi.. :lol:

En tout cas bravo et merci. :)
izi94 Gamer du Dimanche
Gamer du Dimanche
Messages: 14
Inscription: 01 Nov 2007, 01:00
Localisation: Suisse

Message non lupar Meteor93_1 » 23 Avr 2008, 08:01

8O Franchement c'est magnifique tout sa je vais testé sa immediatement cela pourra m'aidé pour mon premier jeu en .lua

Merci :wink:
Avatar de l’utilisateur Meteor93_1

Re: [LUA] créer un système de sauvegarde

Message non lupar jiospike94 » 03 Nov 2008, 15:39

:o :o Le tuto de ouf !!! :o :o
Je n'imagine meme pas le temps que tu a du y mettre.
Franchement :arrow: BRAVO
Image
jiospike94 Gamer Hardcore
Gamer Hardcore
Messages: 715
Inscription: 14 Mai 2011, 16:12
Localisation: Val-de-Marne (94)
Pays: France
Sexe: Homme


 

Retourner vers Underground