Aide pour un projet en C++

Salut!
Je suis un étudiant du Polythécnique de Lausanne en génie mécanique. Je un grand problème avec mon projet sémestrale de C++, qui je n'arrive pas à completer. Je doit programmer un jeu type Asteroid et l'énoncé du projet se trouve dans le site: cowww.epfl.ch/infgmel/ dans le répertoire projet..
Moi je suis arrive jusqu'au test_base et je n'arrive pas à aller plus loin, donc si quelqu'un veut me donner un'aide je lui serati infinitement reconnessaint...SVP!!!!!
PS: Je travvaille sur Unix et on compile avec xemacs et g++
Ciao Valde

3 réponses

  1. ....je te envoit les classes dont je t'a parlait, mais les versions meuilleur je les a à l'école et je vais le poster demain
    ----------------------------------------------------------------------------
    #ifndef __CONFIGFILE_H__
    #define __CONFIGFILE_H__ 1

    #include <iterator>
    #include <iostream>
    #include <fstream>
    #include <string>
    #include <map>

    using namespace std;

    // La classe ConfigFile permet d'aller lire un fichier de configuration.

    class ConfigFile
    {
    public:
    // constructeur
    ConfigFile(string Filename);
    // destructeur
    ~ConfigFile() {}

    // retourne le double associé à la clef "name"
    double doubleValueOf(string name);
    // retourne l'entier associé à la clef "name"
    int intValueOf(string name);
    // retourne la table de définition
    map<string, double> getMap() const;
    // surcharge externe de l'opérateur <<
    friend ostream& operator<<(ostream& sortie, const ConfigFile& config)
    {
    sortie << "Contenu de ConfigFile :" <<endl;
    //parcours toute la table de définition à l'aide d'un itérateur => cours 18
    for (map<string, double>::iterator mapIt(config.getMap().begin()); mapIt!=config.getMap().end(); mapIt++)
    {
    sortie << "\t" <<mapIt->first <<"="<< mapIt->second<< endl;
    }

    return sortie;
    };

    //Fonction de lecture dans un fichier de configuration

    void Lecture(string Filename);

    private:
    //déclaration des variables
    string Filename;
    map<string, double> Configmap;
    ifstream reading;
    };

    #endif
    ----------------------------------------------------------------------------
    #ifndef __PLAYER_H__
    #define __PLAYER_H__ 1

    #include <string>
    #include <iostream>
    #include "Scores.h"

    using namespace std;

    class Player
    {
    public:
    // constructeur
    Player(string name, Scores* scores = new Scores());
    // constructeur de copie
    Player(const Player& player);
    // destructeur
    ~Player();

    // surchage interne de l'opérateur d'affectation
    Player& operator=(const Player & player);

    // indique que le vaisseau du joueur est mort
    void setAlive(bool alive);
    // verifie si le vaisseau du joueur est en vie
    bool isAlive();
    // retourne le nom du joueur
    string getName();
    // retourne l'objet Scores
    Scores* getScores();
    // definit l'attribut scores
    void setScores(Scores* s);
    // surcharge externe de <<
    friend ostream& operator<<(ostream& out, const Player& player);

    private:
    //déclaration des variables
    string name;
    bool alive;
    Scores* scores;
    string etat;
    };
    #endif
    ----------------------------------------------------------------------------
    #include "Player.h"
    #include <iostream>
    #include <string>
    using namespace std;

    //constructeur de la classe Player

    Player::Player(string name, Scores* scores)
    {

    this->name=name;
    this->scores= new(Scores);
    this->scores = scores;
    }

    //constructeur de copie de la classe Player

    Player::Player(const Player& player)
    {
    this->name=player.name;
    this->scores=player.scores;
    }

    //destructeur de la classe Player

    Player::~Player()
    {
    delete scores;
    }

    //ici on fait une surcharge de l operateur =

    Player& Player::operator=(const Player& player)
    {
    this->name=player.name;
    this->scores=player.scores;
    }

    // test si le vessaeau du jouer est mort

    void Player::setAlive(bool alive)
    {
    this->alive=alive;
    }

    //assigne un nom au joueur

    string Player::getName(){return name;}

    // verifeie si le vasseau du jouer est en vie

    bool Player::isAlive()
    {
    if (alive == true) {
    etat = 'est vivant'; }
    else { etat = 'est mort';}
    return alive;
    }

    //retourne l'objet scores

    Scores* Player::getScores(){return scores;}

    //definition de l'attribut scores

    void Player::setScores(Scores* s)
    { scores=s;}

    // surcharge d'operateur <<
    ostream& operator<<(ostream& out,const Player& player)
    { out << "Le joueur " << player.name << " " << player.etat << " avec "<< *player.scores << endl;
    return out;
    }
    ----------------------------------------------------------------------------
    #ifndef __SETUP_H__
    #define __SETUP_H__ 1

    #include <vector>
    #include <iostream>
    #include "Player.h"
    #include "ConfigFile.h"

    using namespace std;

    class Setup
    {
    public:
    /*
    * Pourquoi utiliser un vecteur de joueurs alors que le jeu en
    * possede seulement deux? Tout simplement pour faciliter
    * eventuelle extension: si l'on decide soudain que l'on veut
    * pouvoir jouer a 4 joueurs, il ne sera pas necessaire de
    * modifier le code de gestion de joueurs puisque le vecteur est
    * dynamique.
    */
    //constructeur
    Setup(vector<Player> players, int difficulty);
    // constructeur de copie
    Setup(const Setup& setup);
    // destructeur
    ~Setup();

    // surcharge de l'operateur d'affectation
    Setup& operator=(const Setup& setup);

    // retourne la liste des joueurs
    vector<Player>& getPlayers();
    // retourne le niveau de jeu actuel
    int getDifficulty();
    // definit le niveau de jeu actuel
    void setDifficulty(int diff);
    // surcharge externe de <<
    friend ostream& operator<<(ostream& out, const Setup& setup);

    private:
    //déclaration des variables
    int nbrPlayer;
    vector <Player> players;
    int difficulty;
    };

    #endif
    ----------------------------------------------------------------------------
    #include <vector>
    #include <iostream>
    #include "Setup.h"
    #include "Player.h"
    #include "ConfigFile.h"
    using namespace std;

    //constructeur de la classe Setup

    Setup::Setup(vector<Player>players, int difficulty)
    {
    int nbrplayer=2;
    for(int o(0);o<nbrplayer;o++)
    {
    players.push_back(o);
    }
    this->difficulty=difficulty;
    for(int i(0);i < players.size();i++)
    {
    this->players[i]=players[i];
    };

    }

    //constructeur de copie de la même classe

    Setup::Setup(const Setup& setup)
    {

    this->difficulty=setup.difficulty;

    for(int j(0);j<players.size();j++)
    {
    this->players[j]=Setup.players[j];
    };

    }

    //ici on surcharge l'operateur d'affectation (=)

    Setup& Setup::operator=(const Setup& setup)
    {
    difficulty=setup.difficulty;

    for(int k(0);k<players.size();k++)
    {
    players[k]=Setup.players[k];
    };
    }

    //on défini le getter de la liste des joueurs

    vector<Player>& Setup::getPlayers(){return players;}

    //on défini le getter de la difficulte

    int Setup::getDifficulty(){return difficulty;}

    //on défini le set de la difficulte

    void Setup::setDifficulty(int diff){difficulty=diff;}

    //ici on surcharge l'operateur d'affichage (<<)

    Setup ostream& Setup::operator<<(ostream& out, const Setup& setup)
    {
    out << "La difficulte est " << setup.difficulty << endl;
    for(int l(0);l<players.size();l++)
    {
    out << setup.players[l] << endl;
    };

    return out;
    }

    ---------------------------------------------------------------------------
    Salut!
    0
    1. Resalut,

      indiques nous précisément ce qui te bloque stp on va pas repasser sur tout le programme qd même.
      0
      1. Salut!
        mon problème est dans ces trois classe...Player.cc qui ne m'affiche pas l'état du jouer, Setup.cc qui est appele dans jouer donc à le mème problème et dans ConfigFile.cc qui e lit jamais le ficher...
        Ciao valde
        0
    2. envoies nous ce que tu as fait sur ce forum et on te corrigera/donnera des conseils,

      marvinrouge
      0
      1. Bonjour!
        ça est ce que j'ai fait et ce qui mon donnée pour faire ce projet...
        si vous voulez voir le site du projet lee site c'est cowww.epfl.ch/infgmel/et pas www. etc...salut et merci!
        --------------------------------------------------------------------------------

        #include <vector>
        #include <iostream>
        #include "Setup.h"
        #include "Player.h"
        #include "ConfigFile.h"
        using namespace std;

        //constructeur de la classe Setup

        Setup::Setup(vector<Player>players, int difficulty)
        {
        int nbrplayer=2;
        for(int o(0);o<nbrplayer;o++)
        {
        players.push_back(o);
        }
        this->difficulty=difficulty;
        for(int i(0);i < players.size();i++)
        {
        this->players[i]=players[i];
        };

        }

        //constructeur de copie de la même classe

        Setup::Setup(const Setup& setup)
        {

        this->difficulty=setup.difficulty;

        for(int j(0);j<players.size();j++)
        {
        this->players[j]=Setup.players[j];
        };

        }

        //ici on surcharge l'operateur d'affectation (=)

        Setup& Setup::operator=(const Setup& setup)
        {
        difficulty=setup.difficulty;

        for(int k(0);k<players.size();k++)
        {
        players[k]=Setup.players[k];
        };
        }

        //on défini le getter de la liste des joueurs

        vector<Player>& Setup::getPlayers(){return players;}

        //on défini le getter de la difficulte

        int Setup::getDifficulty(){return difficulty;}

        //on défini le set de la difficulte

        void Setup::setDifficulty(int diff){difficulty=diff;}

        //ici on surcharge l'operateur d'affichage (<<)

        Setup ostream& Setup::operator<<(ostream& out, const Setup& setup)
        {
        out << "La difficulte est " << setup.difficulty << endl;
        for(int l(0);l<players.size();l++)
        {
        out << setup.players[l] << endl;
        };

        return out;
        }

        --------------------------------------------------------------------------------

        #include "ConfigFile.h"
        #include <iterator>

        //constructeur
        ConfigFile::ConfigFile(string fileName)
        {
        //ce methode va lire dans le fichier et "construit" la Map
        ifstream read;
        read.open(fileName.c_str());
        if (read.fail())
        { cout << "Impossible to read" << fileName << endl; }
        else
        {
        string cle;
        string inutile;
        string val;

        while (!read.eof())
        {read >>cle>>inutile>>val;
        Map[cle] = atof(val.c_str());}
        }
        }

        //Renvoi la valeur reél associe à la clef " name"

        double ConfigFile::doubleValueOf(string name)
        {
        return Map.find(name)->second;
        }

        //Renvoi la valeur entier associe à la clef " name"

        int ConfigFile::intValueOf(string name)
        {
        return (int)Map.find(name)->second;
        }

        //ça sert à faire retourner la table de définition

        map<string, double> ConfigFile::getMap() const
        {
        return Map;
        }

        --------------------------------------------------------------------------------

        #ifndef __CONFIGFILE_H__
        #define __CONFIGFILE_H__ 1

        #include <iostream>
        #include <fstream>
        #include <string>
        #include <map>

        using namespace std;

        // La classe ConfigFile permet d'aller lire un fichier de configuration.

        class ConfigFile
        {
        public:
        // constructeur
        ConfigFile(string fileName);
        // destructeur
        ~ConfigFile() {}

        // retourne le double associé à la clef "name"
        double doubleValueOf(string name);
        // retourne l'entier associé à la clef "name"
        int intValueOf(string name);
        // retourne la table de définition
        map<string, double> getMap() const;
        // surcharge externe de l'opérateur <<
        friend ostream& operator<<(ostream& sortie, const ConfigFile& config)
        {
        sortie << "Contenu de ConfigFile :" <<endl;
        //parcours toute la table de définition à l'aide d'un itérateur => cours 18
        for (map<string, double>::iterator mapIt(config.getMap().begin());
        mapIt!=config.getMap().end(); mapIt++)
        {
        sortie << "\t" <<mapIt->first <<"="<< mapIt->second<< endl;
        }

        return sortie;
        }

        private:
        // déclaration de la map
        map <string, double> Map;
        //declaration de la string qui est le nom du fichier de lecture
        string fileName;

        };

        #endif

        --------------------------------------------------------------------------------

        #include "GameScreen.h"

        using namespace std;

        // ça défini le getteur de l'hauteur
        double GameScreen::getHeight()

        {return height;}
        //ça défini le getteur de largeur
        double GameScreen:: getWidth()
        {return width;}

        //ça défini le constructeur
        GameScreen::GameScreen(double width, double height)
        {
        this->width=width;
        this->height=height;
        }
        //ça défini le constructeur de copie
        GameScreen::GameScreen(const GameScreen& GameScreen)
        {
        height=GameScreen.height;

        width=GameScreen.width;
        }

        //ça défoni la surcharge de =
        GameScreen& GameScreen::operator=(const GameScreen& GameScreen)
        {
        this->height=GameScreen.height;
        this->width=GameScreen.width;
        return(*this);
        }

        //ça défini la surcharge de <<
        ostream& operator<<(ostream& cout , const GameScreen& GameScreen)
        {
        cout << "L ecran a une hauteur de " << GameScreen.height << " pixels et une largeur de " << GameScreen.width << " pixels." << endl;
        return cout;
        }

        --------------------------------------------------------------------------------

        #ifndef __GAME_SCREEN_H__
        #define __GAME_SCREEN_H__ 1

        #include <iostream>

        using namespace std;

        class GameScreen
        {
        public:
        // constructeur
        GameScreen(double width, double height);
        // constructeur de copie
        GameScreen(const GameScreen& GameScreen);
        // destructeur
        ~GameScreen() {}

        // surcharge de l'opérateur d'affectation
        GameScreen& operator=(const GameScreen& gameScreen);

        // retourne la hauteur
        double getHeight();
        // retourne la largeur
        double getWidth();
        // surcharge externe de l'opérateur <<
        friend ostream& operator<<(ostream& cout, const GameScreen& GameScreen);

        private:
        //décalaration des variables
        double height;
        double width;
        };

        #endif

        --------------------------------------------------------------------------------

        ## MAKEFILE POUR LE PROJET SPACEROCK

        CFLAGS = -g -Wall `pkg-config gtk+-2.0 --cflags`
        CXXFLAGS = -g -Wall `pkg-config gtk+-2.0 --cflags` -I/usr/local/mysql/include/mysql
        DB_LIBS = -L/usr/local/mysql/lib/mysql -lmysqlclient
        CC = gcc
        CXX = g++
        GL_LIBS = /usr/openwin/lib/libGL.so.1 /usr/openwin/lib/libGLU.so.1
        GLUT_DIR = /home/infgmel3/projet/demo
        GLUT_LIBS = $(GLUT_DIR)/libglut.so -lXmu -lXext -lXi -lX11 -lm
        INFGMELHOME = /home/infgmel/pub/projet

        # objets de base
        BASEHDRS = ConfigFile.h GameScreen.h Player.h Scores.h Setup.h
        BASEOBJS = ConfigFile.o GameScreen.o Player.o Scores.o Setup.o

        PARTICLEOBJS = Particle.o Foe.o Friend.o Ship.o Bullet.o Rock.o ParticleType.o
        PARTICLEHDRS = Particle.h Foe.h Friend.h Ship.h Bullet.h Rock.h

        GLLHDRS = gll/gllSprite.h gll/gllProcess.h gll/gllFont.h gll/gllLibrary.h gll/gllTextures.h gll/gllBMParser.h
        GLLOBJS = gll/gllSprite.o gll/gllProcess.o gll/gllFont.o gll/gllLibrary.o gll/gllTextures.o gll/gllBMParser.o

        ## COMMANDE PAR DEFAUT: tout construire
        all: test_base test_particle sprite level SpaceRock

        ## MAKE SPACEROCK: pour construire le programme SpaceRock
        SpaceRock: gllib $(BASEOBJS) $(PARTICLEOBJS) Game.o Level.o SetupPanel.o SpaceRock.o
        $(CXX) $(CXXFLAGS) $(GL_LIBS) $(GLUT_LIBS) $(DB_LIBS) $(BASEOBJS) $(PARTICLEOBJS) $(GLLOBJS) Game.o Level.o\
        $(INFGMELHOME)/objs/Database.o SetupPanel.o SpaceRock.o -o SpaceRock

        ## NETTOYAGE
        clean:
        rm -f core gll/*.o
        rm -f core *.o SpaceRock test_base test_particle test_sprite test_level

        ## MAKE BASE: pour construire le programme test_base
        test_base: $(BASEOBJS) test_base.o
        $(CXX) $(CXXFLAGS) $(BASEOBJS) test_base.o -o test_base
        test_base.o: $(BASEHDRS) test_base.cc

        ## MAKE PARTICLE: pour construire le programme test_particle
        ## attention, ce programme ne compilera plus tel quel lorsque vous aurez implémenté gllSprite
        test_particle: $(PARTICLEOBJS) test_particle.o
        $(CXX) $(CXXFLAGS) $(PARTICLEOBJS) $(BASEOBJS) test_particle.o -o test_particle
        test_particle.o: $(PARTICLEHDRS) ConfigFile.h test_particle.cc

        ## MAKE SPRITE: pour construire le programme test_sprite
        sprite: gllib $(BASEOBJS) $(PARTICLEOBJS) test_sprite.o
        $(CXX) $(CXXFLAGS) $(GL_LIBS) $(GLUT_LIBS) $(GLLOBJS) $(BASEOBJS) $(PARTICLEOBJS) test_sprite.o -o test_sprite
        test_sprite.o: $(BASEHDRS) $(PARTICLEHDRS) $(GLLHDRS) test_sprite.cc

        ## MAKE LEVEL: pour construire le programme test_level
        level: gllib $(BASEOBJS) $(PARTICLEOBJS) Level.o test_level.o
        $(CXX) $(CXXFLAGS) $(GL_LIBS) $(GLUT_LIBS) $(BASEOBJS) $(PARTICLEOBJS) $(GLLOBJS) Level.o test_level.o -o test_level
        test_level.o: $(BASEHDRS) Particle.h $(GLLHDRS) test_level.cc

        ## REGLES POUR GLLIB
        gllib: $(GLLOBJS)
        gll/gllSprite.o: gll/gllSprite.cc $(GLLHDRS)
        gll/gllProcess.o: gll/gllProcess.cc $(GLLHDRS)
        gll/gllFont.o: gll/gllFont.cc $(GLLHDRS)
        gll/gllLibrary.o: gll/gllLibrary.cc $(GLLHDRS)
        gll/gllBMParser.o: gll/gllBMParser.cc $(GLLHDRS)
        gll/gllTextures.o: gll/gllTextures.cc $(GLLHDRS)

        ## REGLES POUR LES FICHIERS STANDARDS
        Bullet.o: Bullet.cc $(PARTICLEHDRS)
        ConfigFile.o: ConfigFile.cc ConfigFile.h
        Game.o: Game.cc Game.h $(BASEHDRS) $(PARTICLEHDRS) $(GLLHDRS)
        GameScreen.o: GameScreen.cc GameScreen.h
        Foe.o: Foe.cc Foe.h Particle.h
        Friend.o: Friend.cc Friend.h Particle.h Player.h
        Level.o: Level.cc Level.h GameScreen.h $(PARTICLEHDRS) $(GLLHDRS)
        Particle.o: Particle.cc Particle.h GameScreen.h
        ParticleType.o: ParticleType.cc ParticleType.h
        Rock.o: Rock.cc Rock.h Particle.h ParticleType.h Foe.h ConfigFile.h
        Player.o: Player.cc Player.h
        Setup.o: Player.h Setup.h Scores.h ConfigFile.h Setup.cc
        Scores.o: Player.h Setup.h Scores.h Scores.cc
        SetupPanel.o: SetupPanel.cc SetupPanel.h Game.h
        Ship.o: Ship.cc Ship.h Particle.h Friend.h ParticleType.h ConfigFile.h
        SpaceRock.o: SpaceRock.cc Game.h SetupPanel.h HighScores.h $(INFGMELHOME)/include/Database.h

        --------------------------------------------------------------------------------

        #include "Particule.h"
        #include <cmath>
        using namespace std;

        //constructeur
        Particule::Particule(double coordx, double coordy, double vitesse, double direction,
        double taille, double angleRotation,
        GameScreen* ecran)
        {
        this->coordx = coordx;
        this->coordy = coordy;
        this->vitesse = vitesse;
        this->direction = direction;
        this->taille = taille;
        this->angleRotation = angleRotation;
        this->ecran = ecran;
        }

        //les getteurs:
        double Particule::getCoordx(){return coordx;}
        double Particule::getCoordy(){return coordy;}
        double Particule::getVitesse(){return vitesse;}
        double Particule::getDirection(){return direction;}
        double Particule::getTaille(){return taille;}
        double Particule::getAngleRotation(){return angleRotation;}
        GameScreen* Particule::getEcran(){return ecran;}

        //setteurs:
        void Particule::setCoordx(double coordx){this->coordx = coordx;}
        void Particule::setCoordy(double coordy){this->coordy = coordy;}
        void Particule::setVitesse(double vitesse){this->vitesse = vitesse;}
        void Particule::setDirection(double direction){this->direction = direction;}
        void Particule::setTaille(double taille){this->taille = taille;}
        void Particule::setAngleRotation(double angleRotation){this->angleRotation = angleRotation;}
        void Particule::setEcran(GameScreen* ecran){this->ecran = ecran;}

        //collision!!
        bool Particule::Collision(Particule& a)
        {
        double distance;
        distance = sqrt(pow(a.coordx-this->coordx , 2)+pow(a.coordy-this->coordy , 2));
        if (distance<= ((0.8)*(a.taille+this->taille)))
        return true;
        else
        return false;
        }
        //step
        void Particule::Step (double t)
        {
        double deplacex;
        double deplacey;

        deplacex =coordx+ vitesse*t*cos(direction);

        if ((deplacex) >(*ecran).getWidth())
        coordx =deplacex-(*ecran).getWidth();
        else if (deplacex < 0)
        coordx = deplacex + (*ecran).getHeight();
        else
        coordx= deplacex;

        deplacey = coordy +vitesse*t*sin(direction);

        if (deplacey > (*ecran).getHeight())
        coordy = deplacey - (*ecran).getHeight();
        else if (deplacey<0)
        coordy = deplacey + (*ecran).getHeight();
        else
        coordy = deplacey;
        }

        //surcharge externe de <<

        ostream& operator << (ostream& out, const Particule* particle)
        {
        out << (*particle).coordx << (*particle).coordy;
        out << (*particle).vitesse << (*particle).direction << (*particle).taille;
        out << (*particle).angleRotation << (*particle).ecran <<endl;
        }

        --------------------------------------------------------------------------------

        #include <iostream>
        #include "GameScreen.h"

        using namespace std;

        class Particule
        {protected:
        //Constructeur et distructeur
        Particule(double coordx, double coordy, double vitesse, double direction,
        double taille, double angleRotation,
        GameScreen* ecran);
        ~Particule(){}
        //getteurs:
        double getCoordx();
        double getCoordy();
        double getVitesse();
        double getDirection();
        double getTaille();
        double getAngleRotation();
        GameScreen* getEcran();

        //et les setteurs
        void setCoordx(double coordx);
        void setCoordy(double coordy);
        void setVitesse(double vitesse);
        void setDirection(double direction);
        void setTaille(double taille);
        void setAngleRotation(double angleRotation);
        void setEcran(GameScreen* ecran);

        //methodes particuliérs:

        //collision entre deux particules
        bool Collision(Particule& a);

        //step:celui qui calcule la nouvelle position, angluation, ecc
        virtual void Step(double t);

        //display qui est virtuel
        virtual ostream& display (ostream& out)const =0;

        //methodes Virtuelles:isFriend et getType
        virtual bool isFriend();
        virtual int getType();

        //fonction virtuelle qui affichera:

        virtual ostream display (ostream& out);

        //surcharge externe de l'operateur <<

        friend ostream& operator<< (ostream& , const Particule*);

        private:
        //declaration des attributs
        //coordonnes
        double coordx;
        double coordy;
        //vitesse linéaire
        double vitesse;
        //direction de mouvement
        double direction;
        //rayon de la taille de la particule
        double taille;
        //vitesse de rotation
        double angleRotation;
        //pointer sur l'ecran
        GameScreen* ecran;

        };

        --------------------------------------------------------------------------------

        #include "ParticleType.h"

        ParticleType::ParticleType (){
        Ship = 0 ;
        Bullet = 1 ;
        Rock = 2 ; }

        bool ParticleType::isShip (int Var)
        {

        if ( Var == 0 )
        return true;
        else
        return false;
        }
        bool ParticleType::isBullet (int Var)
        {
        if (Var == 1)
        return true;
        else
        return false;
        }
        bool ParticleType::isRock (int Var)
        {
        if (Var ==2)
        return true;
        else
        return false;

        }

        // getteur

        int ParticleType::getShip ()
        {
        return 0;
        }

        int ParticleType::getBullet ()
        {
        return 1;
        }

        int ParticleType::getRock ()
        {
        return 2;
        }

        --------------------------------------------------------------------------------

        #include <iostream>
        using namespace std;

        class ParticleType
        {

        public:
        //constructeur
        ParticleType();

        // vérificateur

        bool isShip (int Var);
        bool isBullet(int Var);
        bool isRock(int Var);

        //déclaration de getteurs

        int getShip ();
        int getBullet();
        int getRock();

        protected:

        // attribution d'un éntier au trois type de particule

        int Ship ;
        int Bullet ;
        int Rock ;
        };

        --------------------------------------------------------------------------------

        #include "Player.h"
        #include <iostream>
        #include <string>
        using namespace std;

        //constructeur de la classe Player

        Player::Player(string name, Scores* scores)
        {

        this->name=name;
        this->scores= new(Scores);
        this->scores = scores;
        }

        //constructeur de copie de la classe Player

        Player::Player(const Player& player)
        {
        this->name=player.name;
        this->scores=player.scores;
        }

        //destructeur de la classe Player

        Player::~Player()
        {
        delete scores;
        }

        //ici on fait une surcharge de l operateur =

        Player& Player::operator=(const Player& player)
        {
        this->name=player.name;
        this->scores=player.scores;
        }

        // killer du player

        void Player::setAlive(bool alive)
        {
        this->alive=alive;
        }

        //assigne un nom au joueur

        string Player::getName(){return name;}

        // verifeie si le vasseau du jouer est en vie

        bool Player::isAlive()
        {
        return alive;
        }

        //retourne l'objet scores

        Scores* Player::getScores(){return scores;}

        //definition de l'attribut scores

        void Player::setScores(Scores* s)
        { scores=s;}

        // surcharge d'operateur <<
        ostream& operator<<(ostream& out,const Player& player)
        { out << "Nom du joueur " << player.name << endl << player.scores << endl;
        return out;
        }

        --------------------------------------------------------------------------------

        #ifndef __PLAYER_H__
        #define __PLAYER_H__ 1

        #include <string>
        #include <iostream>
        #include "Scores.h"

        using namespace std;

        class Player
        {
        public:
        // constructeur
        Player(string name, Scores* scores = new Scores());
        // constructeur de copie
        Player(const Player& player);
        // destructeur
        ~Player();

        // surchage interne de l'opérateur d'affectation
        Player& operator=(const Player & player);

        // indique que le vaisseau du joueur est mort
        void setAlive(bool alive);
        // verifie si le vaisseau du joueur est en vie
        bool isAlive();
        // retourne le nom du joueur
        string getName();
        // retourne l'objet Scores
        Scores* getScores();
        // definit l'attribut scores
        void setScores(Scores* s);
        // surcharge externe de <<
        friend ostream& operator<<(ostream& out, const Player& player);

        private:
        //déclaration des variables
        string name;
        bool alive;
        Scores* scores;
        };
        #endif

        --------------------------------------------------------------------------------

        #include "Scores.h"
        #include <iostream>
        using namespace std;

        // Constructeur de la classe scores

        Scores::Scores(int lastLevelReached, int score)
        {
        this->lastLevelReached=lastLevelReached;
        this->score=score;
        }

        //constructeur par defaut de la classe scores

        Scores::Scores(){}

        //constructeur de copie tousjours de la classe scores

        Scores::Scores(const Scores& scores)
        {
        this->lastLevelReached=scores.lastLevelReached;
        this->score=scores.score;
        }

        //ici on surcharge l'operateur d'affectation (=)

        Scores& Scores::operator=(const Scores& scores)
        {
        this->lastLevelReached=scores.lastLevelReached;
        this->score=scores.score;
        return(*this);
        }

        //on définit le getter du dernier niveau atteint

        int Scores::getLastLevelReached(){return lastLevelReached;}

        //on définit le set du niveau atteint

        void Scores::setLastLevelReached(int lastLevelReached){this->lastLevelReached=lastLevelReached;}

        //on définit le getter du score

        int Scores::getScore(){return score;}

        //on définit le set du score

        void Scores::setScore(int score){this->score=score;}

        //ici on surcharge l' operateur d'affichage (<<)

        ostream& operator<<(ostream& out, const Scores& scores)
        {
        out << "Scores: " << scores.score << endl << "Dernier niveau atteint: "
        << scores.lastLevelReached << endl;
        return out;
        }

        --------------------------------------------------------------------------------

        #ifndef __SCORES_H__
        //Pour verifier qu'il n'y ait qu'une inclusion du fichier.
        #define __SCORES_H__ 1

        #include <iostream>

        using namespace std;

        /*
        * Cette classe contient toutes les informations sur les scores
        * d'un joueur:
        * - son niveau maximum atteint a cette partie;
        * - son score.
        */

        class Scores
        {
        public:
        // constructeur
        Scores(int lastLevelReached, int score);
        //constructeur par defaut
        Scores();
        // constructeur de copie
        Scores(const Scores& scores);
        // destructeur
        ~Scores();

        // operateur d'affectation.
        Scores& operator=(const Scores& scores);

        // retourne le niveau maximal atteint
        int getLastLevelReached();
        // met à jour le dernier niveau atteint
        void setLastLevelReached(int lastLevelReached);
        // retourne le score
        int getScore();
        // met à jour le score
        void setScore(int score);
        // surcharge externe de <<
        friend ostream& operator<<(ostream& out, const Scores& scores);

        private:
        //déclaration des variables
        int lastLevelReached;
        int score;
        };
        #endif

        --------------------------------------------------------------------------------

        #include <vector>
        #include <iostream>
        #include "Setup.h"
        #include "Player.h"
        #include "ConfigFile.h"
        using namespace std;
        //constructeur de la classe Setup

        Setup::Setup(vector<Player>players, int difficulty)
        {
        this-> players=players;
        this-> difficulty=difficulty;
        }

        //constructeur de copie de la même classe

        Setup::Setup(const Setup& setup)
        {

        this->difficulty=setup.difficulty;

        for(int j(0);j<players.size();j++)
        {
        this->players[j]=Setup.players[j];
        };

        }

        //ici on surcharge l'operateur d'affectation (=)

        Setup& Setup::operator=(const Setup& setup)
        {
        difficulty=setup.difficulty;

        for(int k(0);k<players.size();k++)
        {
        players[k]=Setup.players[k];
        };
        }

        //on défini le getter de la liste des joueurs

        vector<Player>& Setup::getPlayers(){return players;}

        //on défini le getter de la difficulte

        int Setup::getDifficulty(){return difficulty;}

        //on défini le set de la difficulte

        void Setup::setDifficulty(int diff){difficulty=diff;}

        //ici on surcharge l'operateur d'affichage (<<)

        Setup ostream& Setup::operator<<(ostream& out, const Setup& setup)
        {
        out << "La difficulte est " << setup.difficulty << endl;
        for(int l(0);l<players.size();l++)
        {
        out << setup.players[l] << endl;
        };

        return out;
        }

        --------------------------------------------------------------------------------

        #ifndef __SETUP_H__
        #define __SETUP_H__ 1

        #include <vector>
        #include <iostream>
        #include "Player.h"
        #include "ConfigFile.h"

        using namespace std;

        class Setup
        {
        public:
        /*
        * Pourquoi utiliser un vecteur de joueurs alors que le jeu en
        * possede seulement deux? Tout simplement pour faciliter
        * eventuelle extension: si l'on decide soudain que l'on veut
        * pouvoir jouer a 4 joueurs, il ne sera pas necessaire de
        * modifier le code de gestion de joueurs puisque le vecteur est
        * dynamique.
        */
        //constructeur
        Setup(vector<Player> players, int difficulty);
        // constructeur de copie
        Setup(const Setup& setup);
        // destructeur
        ~Setup();

        // surcharge de l'operateur d'affectation
        Setup& operator=(const Setup& setup);

        // retourne la liste des joueurs
        vector<Player>& getPlayers();
        // retourne le niveau de jeu actuel
        int getDifficulty();
        // definit le niveau de jeu actuel
        void setDifficulty(int diff);
        // surcharge externe de <<
        friend ostream& operator<<(ostream& out, const Setup& setup);

        private:
        //déclaration des variables
        int nbrPlayer;
        vector <Player> players;
        int difficulty;
        };

        #endif

        --------------------------------------------------------------------------------

        #include "Scores.h"
        #include "Setup.h"
        #include "Player.h"
        #include "ConfigFile.h"
        #include "GameScreen.h"
        #include <iostream>
        using namespace std;

        int main(int argc, char *argv[])
        {
        cout << "***Testing GameScreen******************************"<<endl;
        GameScreen* gs = new GameScreen(1280,768);
        cout << (*gs) << endl;
        GameScreen gs_2 = *gs;
        cout << "Width= "<<gs_2.getWidth()<<endl;
        cout << "height= "<<gs_2.getHeight()<<endl;
        cout << gs_2 <<endl;
        cout << "***End Testing GameScreen**************************\n\n"<<endl;

        cout << "***Testing Scores******************************"<<endl;
        Scores score(3,500);
        cout << score<<endl;
        score.setLastLevelReached(10);
        score.setScore(1000);
        cout << "score.last level:=" << score.getLastLevelReached()<<endl;
        cout << "score.score:=" << score.getScore()<<endl;
        cout << score<<endl;
        Scores score_2=score;
        cout << "Score #2= " << score_2<<endl;
        cout << "***End Testing Scores**************************\n\n"<<endl;

        cout << "***Testing Player******************************"<<endl;
        Scores* score_3= new Scores(score_2);
        Player player("Vincent",score_3);
        cout << player<<endl;
        Player player_1=player;
        cout << "Player #1" << player_1 <<endl;
        Player player_2("Basile",player.getScores());
        player_2.setAlive(false);
        cout << "Player #2 " <<"state:=" << player_2.isAlive()<<endl;
        cout << "Player #2 " <<"name:=" <<player_2.getName()<<endl;
        player_2.setScores(new Scores(5,200));
        cout << "Player #2 " <<"score:="<<*player_2.getScores()<<endl;
        cout << "Player #2 " <<player_2<<endl;
        cout << "***End Testing Player**************************\n\n"<<endl;

        cout << "***Testing Setup*******************************"<<endl;
        vector<Player> joueurs;
        joueurs.push_back(player);
        joueurs.push_back(player_2);
        Setup setup(joueurs,0);
        cout << setup<<endl;

        Setup setup_2=setup;
        setup_2.setDifficulty(20);
        cout <<"Setup #2 " <<setup_2<<endl;

        setup.getPlayers()[0].getScores()->setLastLevelReached(8);
        cout << "Level =" << setup.getPlayers()[0].getScores()->getLastLevelReached()<<endl;
        setup.getPlayers()[0].getScores()->setScore(101);
        cout << "Score =" << setup.getPlayers()[0].getScores()->getScore()<<endl;
        setup.getPlayers()[0].setAlive(true);
        cout << "isAlive =" <<setup.getPlayers()[0].isAlive()<<endl;
        cout<<setup<<endl;
        cout << "***End Testing Setup***************************\n\n"<<endl;

        cout << "***Testing ConfigFile****************************"<<endl;
        ConfigFile cf("Rock.conf");
        cout << cf;
        cout << "Value of damage:= "<<cf.doubleValueOf("damage")<<endl;
        cout << "***End Testing ConfigFile************************\n\n"<<endl;
        }

        --------------------------------------------------------------------------------

        #include "gll/gllLibrary.h"

        #include <iostream>

        #include "Setup.h"
        #include "Level.h"
        #include "GameScreen.h"
        #include "Rock.h"
        #include "Ship.h"
        #include "Bullet.h"

        using namespace std;

        GameScreen gs(640, 480);
        Setup *setup;
        Level *level;

        // Boucle principale
        void test_levelIdleFunc()
        {
        // A FAIRE : implémenter le comportement de ce processus
        double dt = gllTimer(TIMER_GETELAPSEDTIME);
        if (dt == 0.0)
        {
        gllout << gllsetup(16,11,640,480);
        gllTimer(TIMER_RESET);
        gllTimer(TIMER_START);
        }

        level->step(dt);

        Level::LEVEL_OVER state;
        if (state = level->isOver())
        {
        if (state == Level::ALL_SHIPS_DEAD)
        {

        delete level;
        delete setup;
        exit(0);
        }
        else{
        gllTimer(TIMER_STOP);
        level = new Level(level);
        }

        }

        // Demande à glut de redessiner la fenêtre graphique
        glutPostRedisplay();
        }

        // Fonction d'affichage
        void test_levelDisplayFunc()
        {
        // Efface le contenu de la fenêtre
        glClear(GL_COLOR_BUFFER_BIT);

        // A FAIRE : Appeler les fonctions d'affichage
        level->show();

        // Met à jour le contenu de la fenêtre
        glutSwapBuffers();
        }

        // FONCTION MAIN
        int main(int argc, char *argv[])
        {
        // Processus gllib
        gllProcessInformation *pi = new gllProcessInformation();
        pi->name = "test_level_process";
        pi->realTime = true;
        pi->idleFunc = test_levelIdleFunc;
        pi->displayFunc = test_levelDisplayFunc;
        gllRegisterProcess(pi);

        vector<Player> players;
        players.push_back(Player("jean-claude"));
        players.push_back(Player("popeye"));
        setup = new Setup(players, 1);
        level = new Level(setup, &gs);

        // Démarre gllib
        // Le processus donnée en dernier argument sera activé
        // Les autres arguments servent à donner un nom à la fenêtre graphique
        // ainsi que ses dimensions
        gllMainLoop(argc, argv, argv[0], 640, 480, "test_level_process");

        return 0;
        }

        --------------------------------------------------------------------------------

        #include "Particle.h"
        #include "Foe.h"
        #include "Friend.h"
        #include "Ship.h"
        #include "Bullet.h"
        #include "Rock.h"
        #include "ConfigFile.h"
        #include <vector>
        #include <iostream>
        using namespace std;

        //le temps
        const double dt=0.5;

        int main(int argc, char *argv[])
        {
        Player* p1 = new Player("Vincent",new Scores(5,100));
        Player* p2 = new Player("Basile",new Scores());

        cout << "***Testing GameScreen******************************"<<endl;
        GameScreen* gs = new GameScreen(1280,768);
        cout << (*gs) << endl;
        cout << "***End Testing GameScreen**************************\n\n"<<endl;

        //contains the particles
        vector<Particle *> particles;

        cout << "***Testing Ship**********************************"<<endl;
        Ship* s1= new Ship(gs,p1);
        particles.push_back(s1);
        cout << s1 <<endl;
        Ship* s2= new Ship(gs,p2);
        particles.push_back(s2);
        cout << s2 <<endl;
        cout << "***End Testing Ship******************************\n\n"<<endl;

        cout << "***Testing Bullet**********************************"<<endl;
        Bullet* b1= new Bullet(s1,gs);
        particles.push_back(b1);
        cout << b1 <<endl;
        Bullet* b2= new Bullet(s2,gs);
        particles.push_back(b2);
        cout << b2 <<endl;
        cout << "***End Testing Bullet******************************\n\n"<<endl;

        cout << "***Testing Rock************************************"<<endl;
        // le premier paramètre de Rock est le niveau de difficulté,
        // qui est utilisé pour calculer leur vitesse
        Rock* r1= new Rock(3,gs);
        particles.push_back(r1);
        cout << r1 <<endl;
        cout << "***End Testing Rock******************************\n\n"<<endl;

        cout << "***Testing virtual method step*******************"<<endl;
        cout << "Timestamp= "<<dt << endl;
        for (int i=0;i<particles.size();i++)
        {
        particles[i]->step(dt);
        if (particles[i]->isFriend())
        cout<<"Allie (type "<<particles[i]->getType()<<")=>" ;
        else
        cout<<"Ennemie (type "<<particles[i]->getType()<<")=>" ;
        cout << particles[i] << endl;
        }
        //fait avancer seulement la particule 0
        for (int i=0;i<500;i++)
        {
        particles[0]->step(dt);
        }
        cout << particles[0] << endl;
        cout << "***End Testing step******************************\n\n"<<endl;

        cout << "***Testing method colision***********************"<<endl;
        for (int i=0;i<particles.size()-1;i++)
        {
        if (particles[i]->collision(*particles[i+1]))
        cout << "Particles "<<i<< " en collision avec particles "<<i+1<<endl;
        if (particles[i]->collision(*particles[i]))
        cout << "Particles "<<i<< " en collision avec elle meme "<<endl;

        }
        cout << "***End Testing collision******************************\n\n"<<endl;

        }

        --------------------------------------------------------------------------------

        #include "gll/gllLibrary.h"

        #include <iostream>

        #include "GameScreen.h"
        #include "Rock.h"
        #include "Ship.h"
        #include "Bullet.h"

        using namespace std;

        gllSprite sprite(10.0, -1);
        double x_pos = 0.0;

        GameScreen gs(320, 240);
        Rock rock(0, &gs);
        Scores scores;
        Player player("a_player",&scores);
        Ship ship(&gs, &player);
        Bullet bullet(&ship, &gs);

        // Boucle principale
        void test_spriteIdleFunc()
        {
        // A FAIRE : implémenter le comportement de ce processus
        double dt = gllTimer(TIMER_GETELAPSEDTIME);
        x_pos += 40.0 * dt;
        while (x_pos > 320.0)
        x_pos -= 320.0;
        sprite.translate(x_pos, 120.0);
        rock.step(dt);
        ship.step(dt);
        bullet.step(dt);

        // Demande à glut de redessiner la fenêtre graphique
        glutPostRedisplay();
        }

        // Fonction d'affichage
        void test_spriteDisplayFunc()
        {
        // Efface le contenu de la fenêtre
        glClear(GL_COLOR_BUFFER_BIT);

        // A FAIRE : Appeler les fonctions d'affichage
        glColor4f(0.1,0.3,0.2,0.7);
        gllDrawRect(0,20,320,200,-1);

        sprite.blit();

        rock.blit();
        ship.blit();
        bullet.blit();

        // Met à jour le contenu de la fenêtre
        glutSwapBuffers();
        }

        // FONCTION MAIN
        int main(int argc, char *argv[])
        {
        // Processus gllib
        gllProcessInformation *pi = new gllProcessInformation();
        pi->name = "test_sprite_process";
        pi->realTime = true;
        pi->idleFunc = test_spriteIdleFunc;
        pi->displayFunc = test_spriteDisplayFunc;
        gllRegisterProcess(pi);

        sprite.color(1.0, 0.0, 0.0, 0.6);
        ship.x = 160;
        ship.y= 120;
        ship.direction = PI/2.0;
        bullet.x = 160;
        bullet.y = 110;
        bullet.direction = PI/2.0;

        gllTimer(TIMER_START);

        // Démarre gllib
        // Le processus donnée en dernier argument sera activé
        // Les autres arguments servent à donner un nom à la fenêtre graphique
        // ainsi que ses dimensions
        gllMainLoop(argc, argv, argv[0], 320, 240, "test_sprite_process");

        return 0;
        }

        --------------------------------------------------------------------------------

        /*---------------------------------------------------------------------*\
        | GLLIB : FONCTIONS GRAPHIQUES / ENTREES / TEMPS REEL |
        | |
        | Fichier: gllBMParser.bmp |
        \*---------------------------------------------------------------------*/

        /*
        BMParser.cpp
        Copyright (c) 2003 Thibault Genessay

        See the header 'gllBMParser.h' for informations
        */

        #ifdef WIN32
        #include "windows.h"
        #endif

        #include <GL/gl.h>
        #include <GL/glut.h>
        #include "stdio.h"
        #include "math.h"
        #include <string.h>

        #include "gllBMParser.h"

        BMParser::BMParser(const char* bitmap) {
        iErrors = 0;
        strcpy(filename,bitmap);
        pBitmap = NULL;
        file = NULL;
        if (strcmp(bitmap, "") == 0)
        {
        printf("BMP loader error : no file name specified\n");
        iErrors++;
        }else
        if ((file = fopen(bitmap, "rb"))==NULL)
        {
        printf("BMP loader error : could not open file\n");
        iErrors++;
        }
        sz = 0;
        }

        BMParser::~BMParser() {
        if (file != NULL)
        fclose(file);
        }

        void BMParser::Read(void* lpBuf, UINT nCount, bool inverse) {
        if (fread(lpBuf, nCount, 1, file) != 1)
        error("unexpected end of file");
        #ifndef WIN32
        if (inverse)
        {
        // inverse data for non x86 processors
        char* begin = (char*)lpBuf, *end = (char*)lpBuf+nCount-1;
        while (begin < end)
        {
        char tmp = *begin;
        *begin = *end;
        *end = tmp;
        begin++;
        end--;
        }
        }
        #endif
        sz+= nCount;
        }

        Bitmap* BMParser::Parse()
        {
        try {
        // printf("reading header\n");
        if (iErrors)
        error("file is not open");
        pBitmap = new Bitmap;
        Read(pBitmap->sIdentifier, 2);
        Read(&pBitmap->dwFileSize, sizeof(DWORD));
        Read(&pBitmap->dwReserved, sizeof(DWORD));
        Read(&pBitmap->dwDataOffset, sizeof(DWORD));
        Read(&pBitmap->dwHeaderSize, sizeof(DWORD));
        Read(&pBitmap->dwWidth, sizeof(DWORD));
        Read(&pBitmap->dwHeight, sizeof(DWORD));
        Read(&pBitmap->wPlanes, sizeof(WORD));
        // printf("# of planes : %d\n", pBitmap->wPlanes);
        if (pBitmap->wPlanes != 1)
        error("only one plane supported, multiple encountered");
        Read(&pBitmap->wBpp, sizeof(WORD));
        Read(&pBitmap->dwCompression, sizeof(DWORD));
        Read(&pBitmap->dwDataSize, sizeof(DWORD));
        pBitmap->dwPitch = (pBitmap->wBpp / 8) * pBitmap->dwWidth;
        if (pBitmap->dwPitch%4 != 0)
        pBitmap->dwPitch += 4-pBitmap->dwPitch%4;
        if (pBitmap->dwDataSize == 0) // if size is not present, compute it
        pBitmap->dwDataSize = pBitmap->dwPitch * pBitmap->dwHeight;
        else
        if (pBitmap->dwDataSize != pBitmap->dwPitch * pBitmap->dwHeight)
        error("scan-line width * height != bitmap size !! <- this is an unexpected error, probably due to an incorrect file format");
        Read(&pBitmap->dwHRes, sizeof(DWORD));
        Read(&pBitmap->dwVRes, sizeof(DWORD));
        Read(&pBitmap->dwColors, sizeof(DWORD));
        Read(&pBitmap->dwImportantColors, sizeof(DWORD));
        // printf("reading palette\n");
        ReadPalette();
        // printf("reading data\n");
        ReadData();
        return pBitmap;
        } catch (BMError* e) {
        printf("BMP parser error : %s\n", e->msg);
        if (pBitmap)
        delete pBitmap;
        return NULL;
        }
        }

        void BMParser::ReadPalette()
        {
        if (pBitmap->wBpp == BPP_MONOCHROME)
        error("unsupported format : monochrome BMP");
        if (pBitmap->wBpp == BPP_16COLORS)
        error("unsupported format : 4 bpp BMP");
        if (pBitmap->wBpp == BPP_256COLORS)
        {
        /* pBitmap->pPalette = new DWORD[256];
        Read(pBitmap->pPalette, pBitmap->dwColors*sizeof(DWORD));*/
        error("unsupported format : 8 bpp BMP");
        }
        if (pBitmap->wBpp == BPP_HIGHCOLOR)
        error("unsupported format : 16 bpp BMP");
        // 24 bpp and 32 bpp bitmaps do not contain any palette entriy if dwCompression is BI_RGB
        // which is always the case here since other compression formats are not supported
        }

        void BMParser::ReadData()
        {
        if (pBitmap->dwCompression != BI_RGB)
        {
        char buf[64];
        strcpy(buf, "unsupported compressed format : ");
        if (pBitmap->dwCompression == BI_RLE4)
        strcat(buf, "BI_RLE4");
        if (pBitmap->dwCompression == BI_RLE8)
        strcat(buf, "BI_RLE8");
        if (pBitmap->dwCompression == BI_BITFIELDS)
        strcat(buf, "BI_BITFILEDS");
        error(buf);
        }
        pBitmap->pData = new unsigned char[pBitmap->dwDataSize];
        // bmp files are stored bottom-up, so we need to invert the scan-lines
        // i.e. the first line in the file is the bottom line of the image
        for (DWORD i=0;i<pBitmap->dwHeight;i++)
        {
        fseek(file, pBitmap->dwDataOffset+(pBitmap->dwHeight-i-1)*pBitmap->dwPitch, SEEK_SET);
        Read(&pBitmap->pData[i*pBitmap->dwPitch], pBitmap->dwPitch, false);
        }

        if (pBitmap->wBpp == BPP_TRUECOLOR)
        { // in this format, a line is a sequence of triplets (b,g,r), so we invert them to get (r,g,b)
        for (DWORD i=0;i<pBitmap->dwDataSize;i+=3)
        {
        char tmp = pBitmap->pData[i];
        pBitmap->pData[i] = pBitmap->pData[i+2];
        pBitmap->pData[i+2] = tmp;
        }
        }
        if (pBitmap->wBpp == BPP_32)
        { // in this format, a line is a sequence of triplets (b,g,r,a), so we invert them to get (r,g,b,a)
        for (DWORD i=0;i<pBitmap->dwDataSize;i+=4)
        {
        char tmp = pBitmap->pData[i];
        pBitmap->pData[i] = pBitmap->pData[i+2];
        pBitmap->pData[i+2] = tmp;
        }
        }

        }

        bool BMParser::Failed(char *reason)
        {
        if (reason != NULL)
        {
        if (iErrors)
        strcpy(reason, lastError);
        else
        strcpy(reason, "No error");
        }
        return iErrors == 0;
        }

        bool Bitmap::ColorKey(unsigned char key_r, unsigned char key_g, unsigned char key_b)
        {
        // Make a few checks first
        if (pData == NULL)
        {
        printf("ColorKey() failed : image is empty !\n");
        return false;
        }
        if (wBpp != BPP_TRUECOLOR)
        {
        printf("ColorKey() failed : keying is only available for 24 bpp images\n");
        return false;
        }

        // Kepp the old pitch value, we'll need it to index the old data
        DWORD oldPitch = dwPitch;
        // Set new file format (24->32bpp)
        wBpp = BPP_32;
        // Recompute the image pitch and size
        dwPitch = 4*dwWidth;
        dwDataSize = dwPitch * dwHeight;
        // Allocate new memory
        unsigned char *newData = new unsigned char[dwDataSize];
        // The key to look for
        unsigned int key = (key_r<<16) + (key_g<<8) + key_b;
        // Loop through all the pixels
        for (DWORD line=0;line<dwHeight;line++)
        {
        for (DWORD c=0;c<dwWidth;c++)
        {
        unsigned int ir,ig,ib;
        // The color of the current pixel
        ir = pData[line*oldPitch+3*c];
        ig = pData[line*oldPitch+3*c+1];
        ib = pData[line*oldPitch+3*c+2];
        // Compare it with the key
        bool isKey = ((ir<<16) + (ig<<8) + ib) == key;
        int offset = line*dwPitch + 4*c;
        // Fill in new values. Set to black all transparent pixels
        newData[ offset ] = isKey ? 0 : ir;
        newData[offset + 1] = isKey ? 0 : ig;
        newData[offset + 2] = isKey ? 0 : ib;
        newData[offset + 3] = isKey ? 0 : 0xFF;
        }
        }
        // Update the pData pointer
        delete[] pData;
        pData = newData;
        return true;
        }

        inline void Bitmap::ColorAt(unsigned int x, unsigned int y, unsigned char* r, unsigned char* g, unsigned char* b, unsigned char* a)
        {
        int offset = y*dwPitch+(wBpp/8)*x;
        *r = pData[offset];
        *g = pData[offset+1];
        *b = pData[offset+2];
        if (wBpp == 32)
        *a = pData[offset+3];
        }

        inline void Bitmap::ColorAt(unsigned int x, unsigned int y, unsigned char rgba[])
        {
        int offset = y*dwPitch+(wBpp/8)*x;
        for (int i=0;i<wBpp/8;i++)
        rgba[i] = pData[offset+i];
        }

        void Bitmap::Filter(int filter[3][3])
        {
        unsigned char* newData = new unsigned char[dwDataSize];
        for (DWORD l=0;l<dwHeight;l++)
        {
        for (DWORD c=0;c<dwWidth;c++)
        {
        int rgba_dest[4];
        unsigned char rgba_src[4];
        if (c>0&&c<dwWidth-1&&l>0&&l<dwHeight-1)
        {
        for (int x=-1;x<=1;x++)
        {
        for (int y=-1;y<=1;y++)
        {
        int factor = filter[x+1][y+1];
        ColorAt(c+x,l+y,rgba_src);
        for (int i=0;i<wBpp/8;i++)
        {
        rgba_dest[i] += factor*rgba_src[i];
        }
        }
        }
        for (int i=0;i<wBpp/8;i++)
        {
        rgba_dest[i] /= 9;
        if (rgba_dest[i]<0)
        rgba_src[i] = 0;
        else if (rgba_dest[i]>255)
        rgba_src[i] = 255;
        else rgba_src[i] = rgba_dest[i];
        }
        memcpy(&newData[l*dwPitch+(wBpp/8)*c], rgba_src, wBpp/8*sizeof(unsigned char));
        }else{
        memcpy(&newData[l*dwPitch+(wBpp/8)*c], &pData[l*dwPitch+(wBpp/8)*c], wBpp/8*sizeof(unsigned char));
        }
        }
        }
        delete[] pData;
        pData = newData;
        }

        void Bitmap::Smooth()
        {
        int filter[3][3] = {{1,1,1},{1,1,1},{1,1,1}};
        Filter(filter);
        }

        --------------------------------------------------------------------------------

        /*---------------------------------------------------------------------*\
        | GLLIB : FONCTIONS GRAPHIQUES / ENTREES / TEMPS REEL |
        | |
        | Fichier: gllBMParser.h |
        | Description: |
        | Voir ci-dessous (en anglais) |
        \*---------------------------------------------------------------------*/

        /*
        BMParser.h
        Copyright (c) 2003 Thibault Genessay

        Defines the BMParser class which allows to load bitmaps for easy use with OpenGL
        It supports both Unix/Linux and Win32 platforms

        It only supports a few formats because I don't have enough time to complete it
        Feel free to add the lacking functionalities
        Supported BMP formats:
        True Color (24 bpp, RGB)
        True Color with transparency (32 bpp, RGBA)
        Unsupported formats:
        monochrome BMP (1 bpp)
        16 color BMP (4 bpp)
        256 color BMP (8 bpp)
        65536 color BMP (16 bpp)
        and any compressed format

        Usage:
        Create a BMParser instance with the filename as the constructor's parameter
        Call BMParser::Parse()
        - if the call succeeds, it returns a Bitmap structure. The bitmap data
        is stored in the pData field of this structure
        - if any kind of error occured, it returns NULL

        Notes:
        - it is your responsibility to delete the Bitmap structure when
        you don't need it anymore
        - the constructor call cannot fail, hence if the file was not found, you
        won't be notified until you call Parse() or Failed()
        */

        #ifndef __BMPARSER_H
        #define __BMPARSER_H

        typedef unsigned long DWORD;
        typedef unsigned short WORD;

        #define ID_WINDOWS "BM"
        #define ID_OS2_ARRAY "BA"
        #define ID_OS2_COLORICON "CI"
        #define ID_OS2_COLORPOINTER "CP"
        #define ID_OS2_ICON "IC"
        #define ID_OS2_POINTER "PT"

        #define BPP_MONOCHROME 1
        #define BPP_16COLORS 4
        #define BPP_256COLORS 8
        #define BPP_HIGHCOLOR 16
        #define BPP_TRUECOLOR 24
        #define BPP_32 32

        #ifndef WIN32 // already defined in windows GDI
        #define BI_RGB 0 // no compression
        #define BI_RLE8 1 // 8-bit RLE
        #define BI_RLE4 2 // 4-bit RLE
        #define BI_BITFIELDS 3 // rarely used format
        #define UINT unsigned int // Windows doesn't like unsigned ints, but loves UINTs
        #endif //WIN32

        // Represents a BMP file
        struct Bitmap
        {
        char sIdentifier[2]; // a member of ID_XXX
        DWORD dwFileSize; // file size in bytes
        DWORD dwReserved; // reserved for later use
        DWORD dwDataOffset; // offset to the data
        DWORD dwHeaderSize; // may be 28h for windows, OCh for OS/2 1.x and F0h for OS/2 2.x
        DWORD dwWidth; // width of the bitmap in pixels
        DWORD dwHeight; // height
        WORD wPlanes; // 1
        WORD wBpp; // a member of BPP_XXX
        DWORD dwCompression; // a member of BI_XXX
        DWORD dwDataSize; // 32-bit aligned size of the data
        DWORD dwHRes, dwVRes; // resolutions in pixel/meter
        DWORD dwColors; // # of colors used in the bitmap
        DWORD dwImportantColors;// # of important colors
        DWORD *pPalette; // palette: for each entry, 4 bytes R,G,B,X (X is a filler set to 0) if appliable (1,4,and 8 bpp; no palette for 16, 24 and 32 bpp)
        unsigned char *pData; // actual bitmap data
        DWORD dwPitch; // actual scan-line width (32-bit aligned value of dwWidth)

        Bitmap() {
        pData = NULL;
        pPalette = NULL;
        }
        ~Bitmap() {
        if (pData)
        delete[] pData;
        if (pPalette)
        delete[] pPalette;
        }

        inline void ColorAt(unsigned int x, unsigned int y, unsigned char* r, unsigned char* g, unsigned char* b, unsigned char* a=NULL);
        inline void ColorAt(unsigned int x, unsigned int y, unsigned char rgba[]);

        bool ColorKey(unsigned char key_r, unsigned char key_g, unsigned char key_b);
        void Filter(int filter[3][3]);
        void Smooth();
        };

        // The parser itself
        class BMParser
        {
        protected:
        int iErrors;
        struct BMError {
        BMError(const char* _msg) {
        strcpy(msg, _msg);
        }
        char msg[256];
        };
        void error(const char* msg) {
        strcpy(lastError, msg);
        iErrors++;
        throw new BMError(msg);
        }
        int sz;
        char filename[256];
        FILE* file;
        Bitmap* pBitmap;
        void Read(void* lpBuf, UINT nCount, bool inverse = true);
        void ReadPalette();
        void ReadData();

        char lastError[128];
        public:
        BMParser(const char* bitmap);
        ~BMParser();

        Bitmap* Parse();
        Bitmap* GetBitmap() { return pBitmap; };

        bool Failed(char *reason);
        };

        #endif

        --------------------------------------------------------------------------------

        #include "gllFont.h"

        gllFont gllout;

        const int gllFont::bmpLines = 4;
        const int gllFont::bmpColumns = 26;

        gllFont::gllFont()
        {
        active = false;
        for (int i=0;i<4;i++) color[i]=1.0f;
        }

        gllFont::CharPos gllFont::getCharPos(char ch)
        {
        int l,c;
        if (ch >= 'a' && ch <= 'z')
        {
        l=0;
        c=ch-'a';
        }else if (ch >= 'A' && ch <= 'Z')
        {
        l=1;
        c=ch-'A';
        }else if (ch >= '0' && ch <= '9')
        {
        l=2;
        c=ch-'0';
        }else{
        l=2;
        switch (ch)
        {
        case 'à': c=10; break;
        case 'â': c=11; break;
        case '.': c=12; break;
        case 'é': c=13; break;
        case 'è': c=14; break;
        case 'ê': c=15; break;
        case 'ë': c=16; break;
        case 'î': c=17; break;
        case 'ï': c=18; break;
        case 'ô': c=19; break;
        case ',': c=20; break;
        case 'ù': c=21; break;
        case 'û': c=22; break;
        case 'ü': c=23; break;
        case '!': c=24; break;
        case '?': c=25; break;
        default:
        {
        l=3;
        switch (ch) {
        case '+': c=0; break;
        case '-': c=1; break;
        case '_': c=2; break;
        case '=': c=3; break;
        case '\'': c=4; break;
        case '\"': c=5; break;
        case ';': c=6; break;
        case '^': c=7; break;
        case '~': c=8; break;
        case '*': c=9; break;
        case 'ç': c=10; break;
        case '%': c=11; break;
        case '&': c=12; break;
        case '/': c=13; break;
        case '\\': c=14; break;
        case '<': c=15; break;
        case '>': c=16; break;
        case '(': c=17; break;
        case ')': c=18; break;
        case '[': c=19; break;
        case ']': c=20; break;
        case '{': c=21; break;
        case '}': c=22; break;
        case '@': c=23; break;
        case '#': c=24; break;
        case ':': c=25; break;
        }
        }
        }
        }

        return CharPos(l,c);
        }

        const float gllFont::TexCoords::tc_delta = 0.003f;
        gllFont::TexCoords gllFont::getTexCoords(CharPos pos)
        {
        return TexCoords((float)pos.column/(float)bmpColumns,
        (float)pos.line/(float)bmpLines,
        (float)(pos.column+1)/(float)bmpColumns,
        (float)(pos.line+1)/(float)bmpLines);
        }

        gllFont& gllFont::operator<<(FormatToken& token)
        {
        token.execute(*this);
        return (*this);
        }
        #ifndef WIN32
        gllFont& gllFont::operator<<(gllcolor token)
        {
        token.execute(*this);
        return (*this);
        }
        gllFont& gllFont::operator<<(gllalign token)
        {
        token.execute(*this);
        return (*this);
        }
        gllFont& gllFont::operator<<(gllgoto token)
        {
        token.execute(*this);
        return (*this);
        }
        gllFont& gllFont::operator<<(gllsetup token)
        {
        token.execute(*this);
        return (*this);
        }
        gllFont& gllFont::operator<<(gllskipl token)
        {
        token.execute(*this);
        return (*this);
        }
        #endif

        gllFont& gllFont::operator<<(const char* text)
        {
        int l = strlen(text);
        // glBegin(GL_QUADS);
        glColor4fv(color);
        for (int i=0;i<l;i++)
        {
        if (text[i] == ' ') {
        if (++column > maxColumns)
        {
        line++;
        column = 0;
        }
        continue;
        }

        glPushMatrix();
        glTranslatef((float)(column*columnSize)+hcs, (float)(screenHeight-line*lineSize)-hls,0.0f);
        if (align == gllRIGHT)
        glTranslatef((float)(screenWidth-l*columnSize),0.0f,0.0f);
        else if (align == gllMIDDLE)
        glTranslatef((float)(screenWidth-l*columnSize)/2.0f,0.0f,0.0f);
        glBegin(GL_POLYGON);
        // glRotatef(75,0,0,1);
        gllFont::TexCoords tc = getTexCoords(getCharPos(text[i]));
        glTexCoord2f(tc.u_min,tc.v_min);
        glVertex2f(-hcs, hls);
        glTexCoord2f(tc.u_max,tc.v_min);
        glVertex2f(hcs,hls);
        glTexCoord2f(tc.u_max,tc.v_max);
        glVertex2f(hcs,-hls);
        glTexCoord2f(tc.u_min,tc.v_max);
        glVertex2f(-hcs,-hls);
        if (++column > maxColumns)
        {
        line++;
        column = 0;
        }
        glEnd();
        glPopMatrix();
        }
        // glEnd();
        return (*this);
        }

        gllFont& gllFont::operator<<(const string& str)
        {
        return this->operator<<(str.c_str());
        }

        gllFont& gllFont::operator<<(char c)
        {
        char buf[4];
        sprintf(buf, "%c", c);
        return this->operator <<(buf);
        }

        gllFont& gllFont::operator<<(int i)
        {
        char buf[32];
        sprintf(buf, "%d", i);
        return this->operator <<(buf);
        }

        gllFont& gllFont::operator<<(double d)
        {
        char buf[32];
        sprintf(buf, "%f", d);
        return this->operator <<(buf);
        }

        _gllendl gllendl;
        void _gllendl::execute(gllFont& font)
        {
        font.line++;
        font.column = 0;
        }
        _glltab glltab;
        void _glltab::execute(gllFont& font)
        {
        font.column = (font.column/4)*5;
        }
        void gllskipl::execute(gllFont& font)
        {
        if (!noCR)
        font.column = 0;
        font.line += number;
        }
        void gllgoto::execute(gllFont& font)
        {
        font.line = l;
        font.column = c;
        }
        void gllsetup::execute(gllFont& font)
        {
        font.lineSize = sl;
        font.columnSize = sc;
        font.hls = (float)font.lineSize/2.0f;
        font.hcs = (float)font.columnSize/2.0f;
        font.maxLines = h / sl;
        font.screenHeight = h;
        font.maxColumns = w / sc;
        font.screenWidth = w;
        font.line = 0;
        font.column = 0;
        }
        _gllstart gllstart;
        void _gllstart::execute(gllFont& font)
        {
        font.active = true;
        glEnable(GL_TEXTURE_2D);
        glBindTexture(GL_TEXTURE_2D, textureNames[TEX_FONT]);
        font << gllcolor(1,1,1,1);
        font << gllgoto(0,0);
        font << gllalign(gllLEFT);
        }
        _gllend gllend;
        void _gllend::execute(gllFont& font)
        {
        glDisable(GL_TEXTURE_2D);
        font.active = false;
        }
        void gllcolor::execute(gllFont& font)
        {
        memcpy(font.color, col, 4*sizeof(float));
        }
        void gllalign::execute(gllFont& font)
        {
        font.align = type;
        font.column = 0;
        }

        --------------------------------------------------------------------------------

        /*---------------------------------------------------------------------*\
        | GLLIB : FONCTIONS GRAPHIQUES / ENTREES / TEMPS REEL |
        | |
        | Fichier: gllFont.h |
        | Description: |
        \*---------------------------------------------------------------------*/

        #ifndef __GLL_FONT_H__
        #define __GLL_FONT_H__

        #include "gllLibrary.h"

        using namespace std;

        class gllFont;
        extern gllFont gllout;

        struct FormatToken {
        FormatToken() {}
        virtual void execute(gllFont& font) = 0;
        };

        enum gllalign_type {
        gllLEFT,
        gllMIDDLE,
        gllRIGHT
        };

        class gllFont
        {
        static const int bmpLines;
        static const int bmpColumns;
        struct CharPos {
        CharPos(int l, int c) : line(l), column(c) {}
        int line, column;
        };
        struct TexCoords {
        static const float tc_delta;
        TexCoords(float umin, float vmin, float umax, float vmax) :
        u_min(umin+tc_delta), v_min(vmin+tc_delta), u_max(umax-tc_delta),v_max(vmax-tc_delta) {}
        float u_min, v_min, u_max, v_max;
        };
        int line, column, maxLines, maxColumns, lineSize, columnSize, screenHeight, screenWidth;
        float hls, hcs;
        bool active;

        float color[4];
        gllalign_type align;
        public:
        gllFont();

        int getLine() { return line; }
        int getColumn() { return column; }
        int getMaxLines() { return maxLines; }
        int getMaxColums() { return maxColumns; }
        public:
        friend struct _gllendl;
        friend struct _glltab;
        friend struct gllgoto;
        friend struct gllsetup;
        friend struct gllskipl;
        friend struct _gllstart;
        friend struct _gllend;
        friend struct gllcolor;
        friend struct gllalign;

        // void print(const char* text, ...);
        // void printxy(int x, int y, const char* text, ...);

        gllFont& operator<<(FormatToken& token);
        #ifndef WIN32 // gcc n'accepte pas les commandes glout << glcolor directement
        //il faut lui spécifier chaque classe ARRGGG !
        // sous windows avec cl.exe (VC6) , pas de problème
        gllFont& operator<<(gllcolor token);
        gllFont& operator<<(gllgoto token);
        gllFont& operator<<(gllalign token);
        gllFont& operator<<(gllsetup token);
        gllFont& operator<<(gllskipl token);
        #endif
        gllFont& operator<<(const char* text);
        gllFont& operator<<(const string& str);
        gllFont& operator<<(char c);
        gllFont& operator<<(int i);
        gllFont& operator<<(double d);

        private:
        CharPos getCharPos(char ch);
        TexCoords getTexCoords(CharPos pos);
        };

        struct _gllendl : public FormatToken {
        void execute(gllFont& font);
        };
        extern _gllendl gllendl;

        struct _glltab : public FormatToken {
        void execute(gllFont& font);
        };
        extern _glltab glltab;

        struct gllskipl : public FormatToken {
        int number;
        bool noCR;
        gllskipl(int nb, bool noCR = false) {
        number = nb;
        this->noCR = noCR;
        }
        void execute(gllFont& font);
        };

        struct gllgoto : public FormatToken {
        int l,c;
        gllgoto(int line, int col) {
        l = line;
        c = col;
        }
        void execute(gllFont& font);
        };

        struct _gllstart : public FormatToken {
        void execute(gllFont& font);
        };
        extern _gllstart gllstart;

        struct _gllend : public FormatToken {
        void execute(gllFont& font);
        };
        extern _gllend gllend;

        struct gllsetup : public FormatToken {
        int w,h,sl,sc;
        gllsetup(int linSize, int colSize, int screenWidth, int screenHeight) {
        sl = linSize;
        sc = colSize;
        h = screenHeight;
        w = screenWidth;
        }
        void execute(gllFont& font);
        };

        struct gllcolor : public FormatToken {
        float col[4];
        gllcolor(float r, float g, float b, float a) {
        col[0]=r;col[1]=g;col[2]=b;col[3]=a;
        }
        void execute(gllFont& font);
        };
        struct gllalign : public FormatToken {
        gllalign_type type;
        gllalign(gllalign_type t) {
        type = t;
        }
        void execute(gllFont& font);
        };

        #endif

        --------------------------------------------------------------------------------

        /*---------------------------------------------------------------------*\
        0