IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Projets Discussion :

Back to roots


Sujet :

Projets

  1. #41
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Petite passe pour virer la perte de mémoire :-)

    On est passé de :
    ==7632== HEAP SUMMARY:
    ==7632== in use at exit: 1,779,185 bytes in 21,273 blocks
    ==7632== total heap usage: 170,757 allocs, 149,484 frees, 92,409,946 bytes allocated
    à :
    ==7484== HEAP SUMMARY:
    ==7484== in use at exit: 1,260,622 bytes in 2,382 blocks
    ==7484== total heap usage: 101,041 allocs, 98,659 frees, 86,652,923 bytes allocated
    Ensuite, j'ai ajouté l'information du joueur à l'affichage si on veut, j'ajouterai bientôt un groupe de deux personnages et j'ajouterai cette fonctionalité.

    On a aussi un gestionnaire d'armes, qui fonctionne comme un singleton. Partout dans le programme, on pourra accéder à une arme utilisant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    class Weapon_Factory
    {
        public:
            static const Weapon *getWeapon (std::string name);
            static void loadWeapons (std::string);
            static void loadWeapons (LineParser &lp);
     
        protected:
            Weapon_Factory(void);                               // Protected constructor
            ~Weapon_Factory(void);
     
            Weapon_Factory(const Weapon_Factory&);                 // Prevent copy-construction
            Weapon_Factory& operator=(const Weapon_Factory&);      // Prevent assignment
     
            static Weapon_Factory* getInst (void);
     
            //Hashmap
            std::map<std::string, Weapon*> weapons;
            static Weapon_Factory *ourInst;
    };
    Donc par exemple, un joueur a un fichier de configuration donné par :
    #File for one character
    #Name of character
    Zeroc
    #Sprite of character
    data/fighter.txt
    #Attributes: STRENGH, DEXTERITY, INTELLIGENCE, WISDOM, LUCK, CHARISMA, CONSTITUTION
    15
    16
    12
    11
    9
    15
    13
    #Attributes modifiers: STRENGH, DEXTERITY, INTELLIGENCE, WISDOM, LUCK, CHARISMA, CONSTITUTION
    0
    0
    0
    0
    0
    0
    0
    #hit points and max
    200
    200
    #mana and max
    50
    50
    #weapon
    Sword
    Pour l'arme, il suffit de faire ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
        //Get weapon name or empty if none
        std::string weapon_name = lp.getNextLine ();
        if (weapon_name.compare ("empty") == 0)
        {
            weapon = NULL;
        }
        else
        {
            const Weapon *w = Weapon_Factory::getWeapon (weapon_name);
            weapon = w;
        }
    et bam ! on a une arme !

    L'avantage ? Tout est centralisé en un seul fichier de configuration, on peut utiliser du texte ou un identifiant pour l'arme. Pour l'instant, une arme est définie par un dommage intermédiaire qui pourra se modifier dépendant de la force du joueur.

    Je n'ai pas encore la classe des persos (Guerrier, etc.). Ce sera pour plus tard. Pour le moment, je travaille d'abord sur l'interface et la gestion du groupe.

    Je vais attaquer, l'affichage de chaque perso du groupe, l'affichage de l'or, de la nourriture, des objets du groupe, comment équiper les armes/armures.

    Une fois cette gestion de base en place, j'attaquerai le fait que certaines classes ne peuvent pas équiper certaines choses :-)

    Ensuite, on pourra attaquer les magasins et l'achat/vente des objets !
    Jc

  2. #42
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 575
    Points
    218 575
    Billets dans le blog
    120
    Par défaut
    Citation Envoyé par fearyourself Voir le message
    Petite passe pour virer la perte de mémoire :-)
    Mais cela ne semble pas assez. 1,2Mo de perte, c'est plus que ce que la SDL perd de base ( car je ne dit pas que la SDL foire le log, mais pas autant )
    Désolé, vous avez une fuite

    Citation Envoyé par fearyourself Voir le message
    et bam ! on a une arme !
    J'aurais plus dit:
    On a une arme! Et bam!

    Citation Envoyé par fearyourself Voir le message
    L'avantage ? Tout est centralisé en un seul fichier de configuration, on peut utiliser du texte ou un identifiant pour l'arme. Pour l'instant, une arme est définie par un dommage intermédiaire qui pourra se modifier dépendant de la force du joueur.

    Je n'ai pas encore la classe des persos (Guerrier, etc.). Ce sera pour plus tard. Pour le moment, je travaille d'abord sur l'interface et la gestion du groupe.

    Je vais attaquer, l'affichage de chaque perso du groupe, l'affichage de l'or, de la nourriture, des objets du groupe, comment équiper les armes/armures.

    Une fois cette gestion de base en place, j'attaquerai le fait que certaines classes ne peuvent pas équiper certaines choses :-)

    Ensuite, on pourra attaquer les magasins et l'achat/vente des objets !
    Jc
    Ça sent bon le jeu qui tourne dans la finalisation, non? Ou vous pensez qu'il reste beaucoup ?
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #43
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    Mais cela ne semble pas assez. 1,2Mo de perte, c'est plus que ce que la SDL perd de base ( car je ne dit pas que la SDL foire le log, mais pas autant )
    Désolé, vous avez une fuite
    En fait, beaucoup de ca vient des pilotes fglrx. Un peu de la SDL. 5k vient de moi que je dois régler.

    J'aurais plus dit:
    On a une arme! Et bam!
    C'est vrai :-)

    Ça sent bon le jeu qui tourne dans la finalisation, non? Ou vous pensez qu'il reste beaucoup ?
    T'es fou toi ! J'ai encore plein de choses à faire :

    - La sauvegarde
    - La gestion des magasins
    - Les combats: gestion IA, gestion expérience, ce qu'on obtient après le combat
    - Expérience et gestions des niveaux
    ...

    Donc j'ai encore du boulot ;-)
    Jc

  4. #44
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Pleins de screen-shots pour illustrer la mise à jour ;-)

    On va commencer par : un screen-shot montrant l'affichage sur la droite des deux personnages du groupe :

    Nom : Screenshot-Back to roots --- Version: 1.11.png
Affichages : 96
Taille : 161,4 Ko

    Ensuite, nous avons les informations d'un joueur :
    Nom : Screenshot-Back to roots --- Version: 1.11-1.png
Affichages : 79
Taille : 161,6 Ko

    (On a l'autre joueur en appuyant sur la droite, ensuite on a la nourriture + or et les armes disponibles).

    Si on retourne à un joueur et on appuie 'R', on peut changer d'arme :
    Nom : Screenshot-Back to roots --- Version: 1.11-4.png
Affichages : 65
Taille : 161,0 Ko

    Et le nombre d'armes disponibles sont pris en compte.

    J'ai perdu un peu de temps ce soir parce que j'ai voulu séparé la vue générale et la gestion de cet inventaire. Cet après-midi j'avais codé ca directement dans la gestion du fichier gérant la vue générale. Ca faisait pas trop de code en plus (une centaine de lignes) mais j'ai décidé de les séparer en deux ce qui rend le code nettement plus propre.

    Je peux, à présent m'attaquer à la gestion des classes :yeah:
    Jc
    Images attachées Images attachées  

  5. #45
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 575
    Points
    218 575
    Billets dans le blog
    120
    Par défaut
    Citation Envoyé par fearyourself Voir le message
    T'es fou toi ! J'ai encore plein de choses à faire
    Oui, mais je ne sais pas, si j'ose dire, ce sont les trucs marrants à faire, et ce qui sont réellement visible. Du coup, je trouve que c'est du total plaisir à faire cette partie là, et donc ... voilà.

    C'est toujours mieux, que la partie, galérage pendant 1 mois, sur le moteur graphique du jeu
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  6. #46
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    Oui, mais je ne sais pas, si j'ose dire, ce sont les trucs marrants à faire, et ce qui sont réellement visible. Du coup, je trouve que c'est du total plaisir à faire cette partie là, et donc ... voilà.

    C'est toujours mieux, que la partie, galérage pendant 1 mois, sur le moteur graphique du jeu
    Oui je suis d'accord. C'est aussi la partie où tu vois si t'as eu raison de faire certains choix à certains moments ;-)

    Jc

  7. #47
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Pas eu beaucoup beaucoup de temps pour faire d'énormes avancées, mais j'ai ajouté le fait qu'on ne peut pas équipper une arme non autorisée.

    Du coup, un personnage est défini par une classe donné par un fichier de configuration :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #Name of class
    Wizard
    #Number of weapons allowed
    1
    staff
    Et les armes ont maintenant un type:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    #Number of weapons
    4
    #For each weapon: name, type, damage
    Sword
    sword
    50
    Short Sword
    sword
    30
    Long Sword
    sword
    80
    Quarterstaff
    staff
    20
    Ce qui permet d'avoir Mariah, nouvelle équipère de la demo, une mage qui ne peut pas avoir une épée en main.

    On voit que le personnage Zeroc peut équipper toutes les armes disponibles du groupe :
    Nom : Screenshot-Back to roots --- Version: 1.12-4.jpg
Affichages : 73
Taille : 100,9 Ko

    Par contre, Mariah est bien un mage :
    Nom : Screenshot-Back to roots --- Version: 1.12-1.jpg
Affichages : 66
Taille : 104,6 Ko

    Et elle ne peut que équiper :
    Nom : Screenshot-Back to roots --- Version: 1.12-2.jpg
Affichages : 67
Taille : 115,3 Ko

    J'attaque maintenant la gestion d'un magasin histoire de pouvoir acheter/vendre des armes.

    Jc

  8. #48
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 575
    Points
    218 575
    Billets dans le blog
    120
    Par défaut
    Joli petite avancée.
    C'est bien ce que je dit, maintenant c'est beaucoup de tweaking pour ajouter les possibilités ( et restrictions ( depuis quand une épée c'est trop lourd pour un mage gringalet O_o ) )

    Sinon, je pensais, sur l'écran, ça prend beaucoup de place pour cette histoire de boites de dialogues, et les infos sur la droite.
    Disons que sur les screens, ça prend bien ... 1 / 3 de l'écran.

    On aurait pu faire une interface Qt et faire l'integration de la fenêtre dans Qt . Mais bon ... j'arrête de dire n'importe quoi
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  9. #49
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    Joli petite avancée.
    C'est bien ce que je dit, maintenant c'est beaucoup de tweaking pour ajouter les possibilités ( et restrictions ( depuis quand une épée c'est trop lourd pour un mage gringalet O_o ) )
    Pas sûr que ce soit juste du tweaking puisque j'ai pas mal de code à ajouter pour faire ca. Ensuite, pour les magasins, je vais devoir ajouter pas mal de logique et de gestion.

    On verra, j'ai fait une mini pause pour voir la meilleure solution pour le mettre en place.

    Sinon, je pensais, sur l'écran, ça prend beaucoup de place pour cette histoire de boites de dialogues, et les infos sur la droite.
    Disons que sur les screens, ça prend bien ... 1 / 3 de l'écran.

    On aurait pu faire une interface Qt et faire l'integration de la fenêtre dans Qt . Mais bon ... j'arrête de dire n'importe quoi
    Peut-être dans la 2ème version, mais ca c'est fidéle à l'original ;-)
    Jc

  10. #50
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Grosse mise-à-jour avec l'ajout des magasins :-) (mais seulement pour l'achat !)

    On peut à présent dire "buy" à un magasin et il vous propose ce qu'il a.

    On peut acheter (si on a assez d'argent), et bien sûr l'objet se voit ajouter dans l'inventaire.

    J'ai modifié pas mal de petites choses pour rendre le code plus facile à gérer et afin de n'avoir pas besoin de refaire le même code pour tous les magasins. On a donc une nouvelle classe nommée Object qui va servir de conteneur pour tous les types (logique, on fait de l'objet ;-)).

    Les changements des scripts permettent de définir que tout NPC peut vendre des choses ou non. Et on définit ce qu'il peut vendre en ajoutant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #How many things does this merchant have to sell ?
    3
    #Now we have what this merchant sells and a index factor of how expensive
    1 Sword
    2 Short Sword
    2 Long Sword
    L'index permet de déterminer par rapport au prix de base, combien est vendu l'objet dans ce magasin.

    Bref, le code permet donc de faire ce que je montre ici:

    On a l'inventaire vide:
    Nom : Screenshot-Back to roots --- Version: 1.14.jpg
Affichages : 61
Taille : 92,7 Ko

    On est devant le magasin et on discute avec le vendeur et on lui a demandé d'acheter :
    Nom : Screenshot-Back to roots --- Version: 1.14-1.jpg
Affichages : 69
Taille : 109,1 Ko
    On achéte:
    Nom : Screenshot-Back to roots --- Version: 1.14-2.jpg
Affichages : 57
Taille : 107,8 Ko
    On a une arme dans notre inventaire:
    Nom : Screenshot-Back to roots --- Version: 1.14-3.jpg
Affichages : 54
Taille : 102,2 Ko

    J'aurai pu montrer que si nous n'avons pas assez d'or on ne peut pas acheter, que l'or diminue, mais ce sera pour une autre fois :-).

    Maintenant, je vais ajouter la vente des objets pour qu'on puisse avoir de l'or ;-),
    Jc

  11. #51
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 575
    Points
    218 575
    Billets dans le blog
    120
    Par défaut
    Peut on avoir une explication plus détailler de la gestion des objets ... et aussi de l'or.

    La variable de l'or est stocké à quel niveau dans le code ?
    Comment gère t'on les objets ... Le perso du joeur a t'il un pointeur sur l'objet qu'il tient, et une liste d'objet pour son inventaire?
    ( Il doit manquer des question, mais si vous pouviez expliqué comment sont géré les objet... ça serai génial. Un objet est il construit lorsque le joueur l'achète ? )
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  12. #52
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    Peut on avoir une explication plus détailler de la gestion des objets ... et aussi de l'or.
    Commencons par la gestion des objets :

    - Nous avons un singleton qui gére ca. J'ai détruit le Weapon_Factory que j'avais auparavant et je l'ai remplacé par un Object_Factory.

    Cette classe contient deux points d'entrée (en fait 4 mais à cause de la surcharge) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
            //Return object of any type or NULL
            static Object *getObject (std::string name);
            //Return object of given type or NULL
            static Object *getObject (std::string name, ObjectType t);
     
            static void loadObjects (std::string);
            static void loadObjects (LineParser &lp);
    On a deux fonctions pour récupérer des objets, les fonctions getObject.

    Une des deux permet de récupérer l'objet juste avec le nom, l'autre permet d'ajouter un type et rend NULL si l'objet trouvé n'est pas du bon type.

    Alors comment faire cela ? Voici la classe objet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    enum ObjectType {NO_TYPE = 0, WEAPON_TYPE, ARMOR_TYPE};
     
    class Object
    {
        public:
            Object (std::string name, unsigned int genericPrice);
            ~Object (void);
     
            std::string getName (void);
            ObjectType getType (void);
            unsigned int getGenericPrice (void);
     
        protected:
            std::string name;
            ObjectType type;
     
            unsigned int genericPrice;
    };
    On a donc un nom, un type et un prix de base.

    Le type va permettre de savoir si c'est une arme, une armure, autre chose...

    Comment cela fonction au chargement ? Nous avions un fichier data/weapons.txt avant. À présent, nous avons un seul fichier data/object.txt qui sera le fichier des objets. Il est défini comme ceci :
    #Object file
    #We have a number of group of objects
    # For the moment:
    # Weapons
    #
    # For each group:
    # The number of objects for the group
    # The objects
    #
    # For each object:
    # Its name
    # Its type for the object loading
    # Any additional information needed at runtime
    #
    # Types are for the moment:
    # 0 - WeaponType
    #
    ################################################
    #
    # Number of groups
    1
    #############
    #Weapon group
    #############
    #Number of weapons
    4
    #For each weapon:
    # Name
    # Type == 0 (Weapon)
    # Type of weapon
    # Damage
    # Base price
    Sword
    0
    20
    sword
    50
    Short Sword
    0
    10
    sword
    30
    Long Sword
    0
    50
    sword
    80
    Quarterstaff
    0
    40
    staff
    20
    On a donc une entête (comme un message réseau) qui permet de dire combien d'objets sont ici, et ensuite pour chaque objet: quel est son nom, son type et son prix de base.

    Ensuite, on a des informations précises pour un objet... Comment cela se traduit dans la lecture de ce fichier au niveau du code ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    void Object_Factory::loadObjects (LineParser &lp)
    {
        Object_Factory *of = getInst ();
        std::string name;
        ObjectType type;
        int lpType;
     
        //Get number of objects groups in this file
        int nbr = lp.getNumber (), 
            basePrice;
     
        //For each object, load it up
        for (int i = 0; i < nbr; i++)
        {
            //For each group, find the number of objects in this group
            int nbrObj = lp.getNumber ();
     
            for (int i = 0; i < nbrObj; i++)
            {
                Object *obj = NULL;
     
                //Get name and type
                name = lp.getNextLine ();
                lpType = lp.getNumber ();
                basePrice = lp.getNumber ();
     
                //Go from lpType to type
                switch (lpType)
                {
                    case 0:
                        type = WEAPON_TYPE;
                        break;
                    default:
                        assert (0);
                        break;
                }
     
                //Now handle type
                switch (type)
                {
                    case WEAPON_TYPE:
                        {
                        Weapon *weapon = new Weapon (name, basePrice);
                        weapon->loadWeapon (lp);
                        obj = (Object *) weapon;
                        }
                        break;
                    default:
                        assert (0);
                        break;
                }
     
                of->objects[obj->getName ()] = obj;
            }
        }
    }
    Comme on voit, on commence par lire le nombre d'objets. Esnuite, on lit l'en-tête. Avec le type lu, on transfert entre le fichier configuration et les valeurs du jeu (cela permet de changer l'enum d'ordre sans avoir de conséquences désastreuses).

    Enfin, si c'est une arme, on crée l'arme. Enfin, on ajoute l'arme à l'usine d'objet.


    Au final, et comme d'habitude, on a une seule instance pour un objet et les personnages, le groupe, etc. n'utilise qu'un seul pointeur pour tout ca.

    La variable de l'or est stocké à quel niveau dans le code ?
    L'or est stocké au niveau du groupe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            unsigned int gold;              //Gold the group has
            unsigned int food;              //Food the group has
            unsigned int food_eating;
            unsigned int food_eating_nbr;
    Notez la gestion de la nourriture aussi, composante importante du jeu ;-). J'expliquerai un autre jour ou dans un autre post ca ;-).

    Ceci est géré bien sûr par des fonctions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            //Gold related
            unsigned int getGold (void);
            void decreaseGold (unsigned int);

    Comment gère t'on les objets ... Le perso du joeur a t'il un pointeur sur l'objet qu'il tient, et une liste d'objet pour son inventaire?
    Le groupe contient une map pour les armes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
            std::map <std::string, SWeapons*> weapons;       //Weapons the group has
    SWeapons est une simple structure : pointeur de l'arme + nombre d'armes dispo pour le groupe.

    Au final, quand un groupe achéte un objet, le système appelle une fonction addObjectToGroup qui fait ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    void Group::addObjectToGroup (Object *obj, int nbr)
    {
        //Now we check the type and actually send this to the right place
        switch (obj->getType ())
        {
            case WEAPON_TYPE:
                {
                    Weapon *weapon = static_cast<Weapon*> (obj);
                    addWeaponToGroup (weapon, nbr);
                }
                break;
            default:
                assert (0);
                break;
        }
    }
    Ce qui permet d'ajouter l'arme directement au bon endroit.

    On aurait pu avoir simplement une map des objets et pour l'affichage des armes avoir un parcours de la liste et sortir que les armes. Je pense que côté performances c'est presque pareil sauf que là c'est plus clair... Je verrai mais en principe, j'aime cette solution.

    ( Il doit manquer des question, mais si vous pouviez expliqué comment sont géré les objet... ça serai génial. Un objet est il construit lorsque le joueur l'achète ? )
    L'instance de l'objet existe toujours quelque part. Lorsqu'un joueur en achéte un, il ajoute une entrée dans sa map : pointeur + compteur, c'est tout.

    Je pourrai faire un système qui crée les instances à la volée, un jour peut-être, pour le moment, ce système me va ;-)

    En espérant ayant répondu à toutes les questions,
    Jc

  13. #53
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 575
    Points
    218 575
    Billets dans le blog
    120
    Par défaut
    Citation Envoyé par fearyourself Voir le message
    En espérant ayant répondu à toutes les questions,
    Jc
    Oui mais ça en apporte d'autres

    [RADIN]
    Je n'ai pas vu la fonction pour gagner de l'or
    [/RADIN]

    Sinon,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    std::map <std::string, SWeapons*> weapons;
    Quel est la clé ? c'est le nom de l'arme ... je ne pense pas ...

    Sinon, j'avais un gros pressentiment que ce serai une fabrique, derrière tout ça . Je trouve votre système génial
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  14. #54
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    [RADIN]
    Je n'ai pas vu la fonction pour gagner de l'or
    [/RADIN]
    Oui pour le moment elle n'est pas là, elle va apparaître avec la vente des objets ;-) que je suis en train de mettre en place.

    Sinon,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    std::map <std::string, SWeapons*> weapons;
    Quel est la clé ? c'est le nom de l'arme ... je ne pense pas ...
    Ben si justement... Il y aura un seul "Long Sword" alors pourquoi ne pas avoir ca comme clé. Ensuite, chaque arme a son type "sword" dans ce cas, ce qui permet de définir si oui ou non une classe peut l'équiper.

    Sinon, j'avais un gros pressentiment que ce serai une fabrique, derrière tout ça . Je trouve votre système génial
    :-)

    Jc

  15. #55
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Dernière mise à jour pour la journée :
    - La vente des objets.

    Un peu plus difficile que l'achat. Pour un achat, on doit juste afficher ce que le vendeur a comme marchandise. Par contre, pour l'achat, il faut voir ce qui intéresse le marchand et voir si le group le posséde...

    Afin de ne pas avoir à vérifier à chaque rafraîchissement cette liste, on construit une liste de sSellObject. Voici la mini structure pour gérer ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    //Definition of sell structure
    struct sSellObject
    {
        SHaveObject *have_object;
        int price;
    };
    et maintenant, notre classe Conversation contient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            //Sell object vector
            std::vector <sSellObject> *sellObjects;
    Lorsqu'on entame la conversation pour vendre quelque chose, le système regarde chaque objet qu'intéresserait le marchand et questionne le groupe pour savoir s'il l'a.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    void Conversation::buildSellObjects (void)
    {
        //Create sellObjects
        sellObjects = new std::vector<sSellObject>;
     
        //Now we must see what the seller wants and does the group have it ?
        for (unsigned int i = 0; i < npc->getBuyNumber (); i++)
        {
            //Get name
            Object *buy = npc->getBuyObject (i);
     
            //Now that we have the name, let's see if the group has it
            SHaveObject *have_object = group->getObject (buy->getName ());
     
            //If we have it:
            if (have_object != NULL)
            {
                //Add it to our list
                struct sSellObject s = {have_object, npc->getBuyPrice (i)};
                sellObjects->push_back (s);
            }
        }
    }
    Ensuite, ce n'est qu'une question d'afficher cette liste et mettre à jour le nombre d'objets du groupe et mettre à jour la liste au cas où on n'a plus un seul de cet objet...

    Le magasin a l'air d'être entièrement géré ! :yeah:

    Prochaine étape sera de mettre un deuxième magasin qui ne vend pas du tout des armes et voir si le code est aussi générique que je le souhaite :-)
    Jc

  16. #56
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Quelques mises à jour et on a maintenant deux nouveaux magasins :

    - Premièrement on a maintenant un mini-système de niveau et d'expérience
    - On a les armures et la possibilité de les équiper
    Nom : Screenshot-Back to roots --- Version: 1.15.jpg
Affichages : 63
Taille : 116,4 Ko

    - L'or et la nourriture sont devenus des objets comme le reste. J'ai fait cela pour en fait être consistent et cela permet d'avoir un magasin de nourriture gratuitement sans ajouter du code ;-)
    Nom : Screenshot-Back to roots --- Version: 1.15-1.jpg
Affichages : 63
Taille : 114,3 Ko

    - Finalement, tous les X tours (défini arbitrairement) la nourriture descend

    Jc

  17. #57
    Membre averti Avatar de Remizkn
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    322
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 322
    Points : 338
    Points
    338
    Par défaut
    Juste une question, pourquoi faire le jeu en Anglais?
    « N'est pas mort ce qui à jamais dort, et au long des ères peut mourir même la mort. »
    H.P Lovecraft

    « À l'heure actuelle, tout être vivant est potentiellement un membre actif de 4chan...sans même le savoir lui-même. »
    Anonymous

    Le site où se développe le jeu Blackmud et où le bon goût côtoie l'information inutile : ici

  18. #58
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par Remizkn Voir le message
    Juste une question, pourquoi faire le jeu en Anglais?
    2 grandes raisons :

    - Je code généralement en anglais de toute facon donc, juste parce que je présente le jeu qu'ici, cela ne change pas comment je code ;-)

    - Les francais peuvent comprendre l'anglais généralement (pour faire de l'informatique cela est nécessaire à mon humble avis), l'inverse n'est pas vraie.

    Jc

  19. #59
    Membre averti Avatar de Remizkn
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    322
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 322
    Points : 338
    Points
    338
    Par défaut
    Ouais effectivement, tu as bon sur les deux points...N'empêche que perso j'aurais préféré en français.
    « N'est pas mort ce qui à jamais dort, et au long des ères peut mourir même la mort. »
    H.P Lovecraft

    « À l'heure actuelle, tout être vivant est potentiellement un membre actif de 4chan...sans même le savoir lui-même. »
    Anonymous

    Le site où se développe le jeu Blackmud et où le bon goût côtoie l'information inutile : ici

  20. #60
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 575
    Points
    218 575
    Billets dans le blog
    120
    Par défaut
    Citation Envoyé par Remizkn Voir le message
    Ouais effectivement, tu as bon sur les deux points...N'empêche que perso j'aurais préféré en français.
    On fera une traduction
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

Discussions similaires

  1. [phpMyAdmin] [phpMyAdmin] Problème mot de passe Root !
    Par StouffR dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 7
    Dernier message: 26/09/2014, 11h59
  2. IDE vs programmation "roots" ?
    Par yoloosis dans le forum Débats sur le développement - Le Best Of
    Réponses: 44
    Dernier message: 27/01/2005, 00h37
  3. Comment change l'utilisateur root de mysql?
    Par silvermoon dans le forum Installation
    Réponses: 3
    Dernier message: 29/10/2003, 11h25
  4. probleme identification et mot de passe root
    Par freums dans le forum Débuter
    Réponses: 5
    Dernier message: 19/09/2003, 17h09
  5. Password root perdu !!
    Par Va(l)ve dans le forum Administration système
    Réponses: 8
    Dernier message: 18/08/2003, 22h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo