Historique des modifications - Message

Message #3776

Sujet: Création d'un système Sauvegarde/Chargement


Type Date Auteur Contenu
Dernière modification 22-02-2009 00:47:59 bestben
Bon le plus dur reste à faire : le chargement
tout comme la sauvegarde, 2 fichiers -> Chargement.cpp et Chargement.h
//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.

//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 == '\
')
        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 == '\
')
            numNom--;
    }
    getline(FichierPerso, m_Nom);
	Fichier.close();
	};
    
};

Bon quand vous voyez ça vous vous dîtes beaucoup de lignes pour juste récupérer 3 nombres, mais la difficulté est qu'avec fstream on ne peut récupérer que des string donc
il faut ensuite convertir ses string en int pour pouvoir les envoyer à la Cam

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

donc là on ce place au début du fichier grâce à seekg puis on met une boucle qui s'applique tant que num > à 0
FFichier.get(caractere); et caractereLu = caractere; servent à se déplacer d'un caractère à chaque passage de la boucle et si le caractère est = à \
num est diminuer de 1
puis on récupère la ligne entière grâce à getline
voilà on a récupéré 1 string contenant notre nombre
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 déclare streamNumb puis grâce aux flux on convertit la string en int
streamNumb.fail() sert à nous avertir si la string n'est pas composée de nombres

Enfin on donne les coordonnées à notre Cam
m_camerafps->setPosition(vector3df(x,y,z));

Si vous trouvez des erreurs n'oubliez pas de me le signaler
Création du message 31-03-2008 20:52:51 bestben
Bon le plus dur reste à faire : le chargement
tout comme la sauvegarde, 2 fichiers -> Chargement.cpp et Chargement.h
//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.

//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 == '\
')
        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 == '\
')
            numNom--;
    }
    getline(FichierPerso, m_Nom);
	Fichier.close();
	};
    
};

Bon quand vous voyez ça vous vous dîtes beaucoup de lignes pour juste récupérer 3 nombres, mais la difficulté est qu'avec fstream on ne peut récupérer que des string donc
il faut ensuite convertir ses string en int pour pouvoir les envoyer à la Cam

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

donc là on ce place au début du fichier grâce à seekg puis on met une boucle qui s'applique tant que num > à 0
FFichier.get(caractere); et caractereLu = caractere; servent à se déplacer d'un caractère à chaque passage de la boucle et si le caractère est = à \
num est diminuer de 1
puis on récupère la ligne entière grâce à getline
voilà on a récupéré 1 string contenant notre nombre
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 déclare streamNumb puis grâce aux flux on convertit la string en int
streamNumb.fail() sert à nous avertir si la string n'est pas composée de nombres

Enfin on donne les coordonnées à notre Cam
m_camerafps->setPosition(vector3df(x,y,z));

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

Retour

Options Liens officiels Caractéristiques Statistiques Communauté
Préférences cookies
Corrections
irrlicht
irrklang
irredit
irrxml
Propulsé par Django
xhtml 1.0
css 2.1
884 membres
1440 sujets
11337 messages
Dernier membre inscrit: Saidov17
204 invités en ligne
membre en ligne: -
RSS Feed