Création d'un système Sauvegarde/Chargement
Propos par bestben

le lundi 31 mars 2008 22h 20mn 05s

6346 visualisations



Bonjours
Dans ce tuto je vais abord les systme de sauvegarde/chargement,
je sait que le temps est beaucoup au mmorpg/fps en ligne mais pouvoir sauvegarder des informations est toujours utile.
Un "gestionnaire" de fichier existe dans irrlicht mais j'utiliserai directement du c++ grce fstream qui pourra sur un long terme vous permettre de faire plus de choses je pense.
ATTENTION  je ne vais pas vous montrer un systme ultra perfectionn qui vous sauvegarde tout votre jeux mais des bases pouvant vous aider :

Systme de sauvegarde :
bon il va se composer des 2 fichiers Sauvegarde.cpp et Sauvegarde.h

Code:

//Sauvegarde.h

#ifndef DEF_SAVE
#define DEF_SAVE

#include <iostream>
#include <irrlicht.h>
#include <fstream>

class Sauvegarde
{
    public:
    Sauvegarde(char* fichier, irr::scene::ICameraSceneNode* camerafps, std::string Nom, int Vie);
    ~Sauvegarde();
    void Save();

    private:
    irr::scene::ICameraSceneNode* m_camerafps;
    char* m_fichier;
    irr::core::vector3df posCam;
    int m_Vie;
    std::string m_Nom;
};

#endif

bon pour l'instant rien de trs difficile

Code:

//Sauvegarde.cpp
#include "Sauvegarde.h"

using namespace irr;
using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;
using namespace std;

Sauvegarde::Sauvegarde(char* fichier, irr::scene::ICameraSceneNode* camerafps, std::string Nom, int Vie)
{
    m_fichier = fichier;
    m_camerafps = camerafps;
    m_Nom = Nom;
    m_Vie = Vie;
}

Sauvegarde::~Sauvegarde();

void Sauvegarde::Save()
{
        if(m_fichier && m_camerafps)
        {
        posCam = m_camerafps->getPosition();
        ofstream sauvegarde(fichier, ios::out | ios::trunc);
        if(sauvegarde)
        {
           sauvegarde << "Pos X,Y,Z" << "\n" << posCam.X << "\n" << posCam.Y << "\n" << posCam.Z << "\n" << endl;
           sauvegarde << "Perso" << "\n" << m_vie << "\n" << m_nom  << endl;
        }
        sauvegarde.close();
        }
}

voil le systme de sauvegarde est fini il ne vous reste plus qu' dclarer votre objet dans votre main() et d'appeler
Sauvegarde(char* fichier, irr::scene::ICameraSceneNode* camerafps, std::string Nom, int Vie)

si vous voyez des erreurs ou des amliorations n'hsitez pas les faire partager lol

Prochaines tapes le chargement =>


#1 

31-03-2008 22:52:51

bestben
Abonn
Date d'inscription: 20-10-2007
Messages: 133

Bon le plus dur reste faire : le chargement
tout comme la sauvegarde, 2 fichiers -> Chargement.cpp et Chargement.h

Code:

//Chargement.h
#include <iostream>
#include <Irrlicht.h>
#include <string>
#include <sstream>
#include <fstream>

class Chargement
{
  public:
  Chargement(char* Fichier, irr::scene::ICameraSceneNode* camerafps, int Vie, std::string Nom);
  ~Chargement();
  void ChargePos();
  void ChargePerso();

  private:
  void ChargeNumb(int num, int *Coord);
  irr::scene::ICameraSceneNode* m_camerafps;
  char* m_Fichier;
  long nombreLignes, numX, numY, numZ, numNom, numVie;
  int caractereLu;
  std::string StringNumb;
  std::string m_Nom;
  char caractere;
  int x, y, z, Coo;
  int m_Vie;
};

Bon je pense que le code n' pour le moment pas besoin d'tre expliquer, vous comprendrez toutes les variables dans Chargement.cpp qui arrive.

Code:

//chargement.cpp

#include "Chargement.h"

using namespace irr;
using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;
using namespace std;

Chargement::Chargement(char* Fichier, irr::scene::ICameraSceneNode* camerafps, int Vie, std::string Nom)
{
    m_Fichier = Fichier;
    m_camerafps = camerafps;
    m_Vie = Vie;
    m_Nom = Nom;
    int caractereLu = 0;
    char caractere; 
};

Chargement::~Chargement();

void Chargement::ChargePos()
{
    x = 0; y = 0; z = 0;
    m_Fichier = "Save/Player.irrSave";
    nombreLignes = 0;
    numX = 1; numY = 2; numZ = 3;
    ChargeNumb(numX, &x);
    ChargeNumb(numY, &y);
    ChargeNumb(numZ, &z);
    m_camerafps->setPosition(vector3df(x,y,z));
};

void ChargeNumb(int num, int *Coord)
{
ifstream FFichier(m_Fichier, ios::in | ios::binary);
if(FFichier)
{
FFichier.seekg(0, ios::beg);
while (num > 0)
{
    FFichier.get(caractere);
    caractereLu = caractere;
    if (caractereLu == '\n')
        num--;
}
getline(Fichier, StringNumb);
    
std::istringstream streamNumb(StringNumb);
streamNumb >> Coo;
*Coord = Coo;
if (streamNumb.fail()==true)
{
 std::cout << "fail" << std::endl;
};
streamNumb.clear();
StringNumb.clear();
FFichier.close();
}
};

void Chargement::ChargePerso()
{
    nombreLignes = 0; numNom = 6; numVie = 7;
    LoadNumb(numVie, &m_Vie);
    ifstream FichierPerso(m_Fichier, ios::in | ios::binary);
    if(Fichier)
    {
    FichierPerso.seekg(0, ios::beg);
    while (numNom > 0)
    {
        FichierPerso.get(caractere);
        caractereLu = caractere;
        if (caractereLu == '\n')
            numNom--;
    }
    getline(FichierPerso, m_Nom);
    Fichier.close();
    };
    
};

Bon quand vous voyez a vous vous dtes beaucoup de lignes pour juste rcuprer 3 nombres, mais la difficult est qu'avec fstream on ne peut rcuprer que des string donc 
il faut ensuite convertir ses string en int pour pouvoir les envoyer la Cam

Code:

    FFichier.seekg(0, ios::beg);
    while (num > 0)
    {
        FFichier.get(caractere);
        caractereLu = caractere;
        if (caractereLu == '\n')
            num--;
    }
    getline(Fichier, StringNumb);

donc l on ce place au dbut du fichier grce seekg puis on met une boucle qui s'applique tant que num > 0       
FFichier.get(caractere); et caractereLu = caractere; servent se dplacer d'un caractre  chaque passage de la boucle et si le caractre est = \n num est diminuer de 1
puis on rcupre la ligne entire grce getline 
voil on a rcupr 1 string contenant notre nombre

Code:

std::istringstream streamNumb(StringNumb);
streamNumb >> Coo;
if (streamNumb.fail()==true)
{
 std::cout << "fail" << std::endl;
};

L je ne peut pas vous expliquer vraiment le fonctionnement de ceci mais en gros on dclare streamNumb puis grce aux flux on convertit la string en int
streamNumb.fail() sert nous avertir si la string n'est pas compose de nombres

Enfin on donne les coordonnes notre Cam
m_camerafps->setPosition(vector3df(x,y,z));

Si vous trouvez des erreurs n'oubliez pas de me le signaler

Dernire modification par bestben (22-02-2009 01:47:59)

Hors ligne


#2 

11-05-2008 12:46:55

hardcpp
Abonn
Date d'inscription: 26-04-2008
Messages: 229

merci beaucou

Hors ligne


#3 

11-05-2008 14:36:50

bestben
Abonn
Date d'inscription: 20-10-2007
Messages: 133

ya pas de quoi si sa peut servir

Hors ligne


#4 

24-06-2008 11:25:29

BooBs
Petit nouveau
Date d'inscription: 24-06-2008
Messages: 8

Merci beaucoup c'est tres utile !!

Hors ligne


#5 

18-11-2012 19:12:21

OzVessalius
Petit nouveau
Date d'inscription: 18-11-2012
Messages: 8

Je veux pas troller, mais, a existe Boost.Serialization, et c'est 1000x plus simple que a.

Hors ligne


#6 

18-11-2012 20:38:22

tmyke
Administrateur
Date d'inscription: 24-03-2008
Messages: 1025

c'est toujours intressant sur la plan du code dj, voir instructif pour certains.
De plus, cela a quand mme plus de ...4 ans....

Hors ligne


#7 

18-11-2012 20:40:33

OzVessalius
Petit nouveau
Date d'inscription: 18-11-2012
Messages: 8

a peut tre toujours utile pour certains.
Sur le plan du code, je suis d'accord, mais dans ce cas autant montrer la srialisation binaire et tout.
Dsol, pour le remontage ^^

Hors ligne


Options Liens officiels Caractristiques Statistiques Communaut
Corrections
irrlicht
irrklang
irredit
irrxml
xhtml 1.0
css 2.1
Propuls par FluxBB
Traduit par FluxBB.fr
Analys par
872 membres
1423 sujets
11109 messages
Dernier membre inscrit: Glider
11 invits en ligne
Aucun membre connect
RSS Feed

[ Gnre en 0.016 sec., 12 requtes excutes ]