Partagez
Aller en bas
ZangtherOld
ZangtherOld
Membre

Nombre de messages : 1711
Date d'inscription : 07/08/2009

Sauvegarder des données directement dans le fichier de sauvegarde. [ Resolu ] Empty Sauvegarder des données directement dans le fichier de sauvegarde. [ Resolu ]

le Mer 3 Fév 2010 - 22:43
Salut tout le monde.
Bien que je me sois pris un super bide quand j'ai posté mon joli petit script, il en faut plus pour me décourager.

Donc je travaille sur un projet assez conséquent. Pour prévoir la suite de ce script. il me faut savoir quelque chose.

Je voudrais sauvegarder les données récupérées avec les Marshal.load(file) dans plusieurs endroit pour pouvoir les réutiliser plus tard. Il faudrait que je puisse les sauvegarder dans la sauvegarde du jeu.

Vous sauriez comment je peux faire ?

Merci de vos réponses.


Dernière édition par Zangther le Jeu 4 Fév 2010 - 21:39, édité 1 fois
Berka
Berka
Administrateur

Nombre de messages : 1832
Age : 29
Localisation : Paris
Distinction : rubyste déglingué
9ème dan en scripting-no-jutsu

Nouveau Justine Beber ;P
Date d'inscription : 16/12/2007
http://rpgruby.olympe-network.com

Sauvegarder des données directement dans le fichier de sauvegarde. [ Resolu ] Empty Re: Sauvegarder des données directement dans le fichier de sauvegarde. [ Resolu ]

le Mer 3 Fév 2010 - 23:23
Déjà quelques petites questions ? Tu veux utiliser le meme fichier de sauvegarde que la partie, ou bien recréer un autre fichier rvdata qui ne contiendra que tes données ?

Rgss comme ruby possède la classe Marshal. Pour la culture générale, c'est une fonction de sérialisation. En gros elle convertit un objet ruby en données sous forme de chaines inscriptibles dans un fichier. Le principe est relativement simple: lorsque tu sérialises, ruby récupere toutes les variables d'instance et de classes, les attributs de l'objet et les convertit en tableau. Lors de la désérialisation, le chargement, il n'a qu'à créer une nouvelle instance de l'objet en passant toutes les variables de classe et d'instance avec les données sauvées. Le mieux c'est que le module Marshal permet la sauvegarde de plusieurs objets dans un meme fichier.

La seule condition est de conserver l'ordre de sauvegarde à l'identique de l'ordre de chargement. Bref... pour charger une donnée dans le fichier de sauvegarde généré par les scripts de base, tu n'as qu'à rajouter à la suite des autres:

Code:
Marshal.dump(objet, instance_de_fichier_ouvert)
et pour charger:
Code:
nouvel_objet_chargé = Marshal.load(instance_de_fichier_ouvert)

Il faut que tu gardes le meme ordre, sinon marshal va se mélanger les index d'objets

J'espere t'avoir aidé,

Berka
ZangtherOld
ZangtherOld
Membre

Nombre de messages : 1711
Date d'inscription : 07/08/2009

Sauvegarder des données directement dans le fichier de sauvegarde. [ Resolu ] Empty Re: Sauvegarder des données directement dans le fichier de sauvegarde. [ Resolu ]

le Mer 3 Fév 2010 - 23:43
Merci de ta réponse. En fait j'avais regardé un peu Scene_File et j'avais trouvé ça mais j'étais pas sur ^^.


Mais quelques autres questions vienne à mon esprit ^^

Est ce que ça va surcharger de beaucoup le fichier de sauvegarde d'ajouter plein de Marshall comme ça ?

C'est grave si on le ne les charge pas tout de suite dans dans le scene_file ?

Il faut modifier Scene_File pour insérer la sauvegarder des fichiers ? Ou alors on peut le faire autrement ?

Est-il possible d'utiliser la fonction Marshall dans un appel de script en event ?

EDIT : Ah aussi, à propos des marshalls aussi, si je mets le contenu de $game_party par exemple dans la variable $truc, est ce que $game_party.matchin sera égal quand même à $truc.machin ?
Berka
Berka
Administrateur

Nombre de messages : 1832
Age : 29
Localisation : Paris
Distinction : rubyste déglingué
9ème dan en scripting-no-jutsu

Nouveau Justine Beber ;P
Date d'inscription : 16/12/2007
http://rpgruby.olympe-network.com

Sauvegarder des données directement dans le fichier de sauvegarde. [ Resolu ] Empty Re: Sauvegarder des données directement dans le fichier de sauvegarde. [ Resolu ]

le Mer 3 Fév 2010 - 23:58
Franchement, non, tu peux marshaliser autant que tu veux, ca ne fait pas vraiment de différence. Le Rgss utilise une compression de donnée (via zlib, donc comme le zip) pour ses fichiers de sauvegarde. Il y a un module Zlib sous Rgss, donc qui fournit les fonctions Zlib::Inflate.inflate et Zlib::Deflate.deflate dont je n'expliquerai pas le fonctionnement en public : la plus grosse erreur de Enterbrain Twisted Evil

Tu peux ne pas charger les fichiers directement, mais tu vas etre confronté à certains probleme.
Marshal lit le fichier de sauvegarde. Tu as une sorte de curseur de lecture dans le fichier (le nombre de bytes lus/le nombre total de bytes du fichier). Lorsque tu ouvres ton fichier, il va mettre ce curseur à 0, au fur et à mesure de la lecture (ici le chargement marshal) le curseur va se déplacer. Si tu ne charges pas toutes tes données au meme moment tu risques de modifier la position du curseur de lecture dans le fichier. Il va falloir que tu instancies l'ouverture du fichier File.open(path, "rb") à une variable globale et que tu ne le fermes quasiment jamais. Dans ce cas, tu pourras charger tes derniers Marshal.load sans retoucher à ceux déja ouverts.

Mais tu ne pourras pas je pense réouvrir entre temps ce fichier pour une autre sauvegarde, ni y toucher afin de déplacer le curseur. Enfin, si tu veux recharger un marshal plusieurs fois, tu devra fermer puis réouvrir le fichier.

Bon, je ne suis pas clair... mais c'est dur d'expliquer cela sans exemple...

Pour ton edit: nan tu peux assigner n'importe quelle variable.
quand tu fais:

Code:
Marshal.dump($instance, fichier)
tu stockes une "image" de l'objet instancié par $instance. C'est à dire un tas de données qui permettront de créer un nouvel objet à l'identique.
Alors, quand tu fais:
Code:
Marshal.load(fichier)
Ruby te renvoie un nouvel objet, initialisé à l'identique de $instance. Donc tu peux mettre n'importe quelle variable pour l'instancier:
Code:
truc = Marshal.load(fichier)
truc == $instance # => true en gros...

C'est vraiment très intéressant d'étudier la sérialisation. C'est le meilleur moyen pour comprendre à fond la programmation orientée objet (POO).
ZangtherOld
ZangtherOld
Membre

Nombre de messages : 1711
Date d'inscription : 07/08/2009

Sauvegarder des données directement dans le fichier de sauvegarde. [ Resolu ] Empty Re: Sauvegarder des données directement dans le fichier de sauvegarde. [ Resolu ]

le Jeu 4 Fév 2010 - 21:33
Le principe des Marshal j'avais un peu compris.
J'ai trouvé sur le forum un sujet de demande d'aide qui traite de ce sujet.

Bref merci de tes réponses. Normalement cela va bien m'avancer !
Revenir en haut
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum