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

C++ Discussion :

Architecture de Programme .


Sujet :

C++

  1. #1
    Membre éclairé
    Inscrit en
    Octobre 2004
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 616
    Par défaut Architecture de Programme .
    (re)Bon(jour)(soir) a tous !!
    Je m'en vais chercher de l'aide parmis les méandres du net, car ma tête a l'heure actuelle est sur le point d'explosée .

    Je ne sais même pas par quel bout prendre le probléme !
    Enfin, pour faire bref, je code un debut de rpg en 2D (tile-based) .
    J'en suis au tout début . Je code tout ca en OpenGL / SDL pour le moment .
    Et j'aimerai tout d'abord dire un grand merci a tout ceux qui m'ont aidé jusqu'a maintenant , votre aide m'a été précieuse !

    J'en suis a un point, ou il faut que je fasse le point ( désolé du JdM ... ) .
    Car je me rend compte que d'avancer a tatons, ca finit par devenir assez difficile et périllieux .

    Mon but en ce moment est double :
    - créer un ensemble de classes me permettant de gérer la base de mon jeu .
    - créer un system de texte dont le mécanisme sera simillaire a ceux que j'emploirai une fois le jeu plus avancé . ( pour gérer toute sorte de choses )

    Ces deux choses sont intiement liée ( sans la premiére, je n'ai pas la deuxiéme ; et sans la deuxiéme, la premiére ne me sert a rien )

    Mon probléme ?
    Ce n'est pas une erreru de code ect ... ces choses la sont en générale facile a résoudre ( avec aide si necessaire mais toujours assez "simple" )

    Par contre, je me heurte a des probléme plus "théorique" .
    Je ne vois pas trop comment vous exposer clairement le probléme sans détailler tout ce que j'ai fait jusqua présent ... mais bon on va essayer .

    D'une maniére générale, je vais de la fin vers le début ... c'est un peu déroutant par fois ; car j'ai le resultat final en tête mais pas forcément les étapes intermédiaire .
    Donc en général je supose l'étape X-1 et je crée l'étape X ; ensuite je supose l'étape X-2 et je fait l'étape X-1 et ainsi de suite .

    En exemple concret :
    -> on supose que j'ai un objet cPersonnage ( par ex ) celui-ci posséde entre autre une IA et tout le blabla qui va avec; et a partir d'une action donnée, ( on s'aproche de lui par ex. ) il va parler !
    -> mon but : afficher a l'ecran le texte qu'il va dire, le disposer clairement ect, le formater a partir de sa lecture dans un fichier texte ect ...

    -> on va donc pour simplifier les choses ( ca revient a la suposition de l'étape x-1 )
    Pour cela : on va ( ne possédant pas encore de calsse cPersonnage), juste simulé le déclencheur du dialogue en début de notre programme .Et mettre tout les attribut necessaire a ce diablogue dans notre classe principale par ex .
    Ensuite, deuxiéme simplification, je ne posséde par encore de classe me permettant de parser mes fichier .txt ou sont contenus mes info ( le dialogue en question par ex. ) Donc je vais a l'initialisation du programme, affecter directement les valeurs contenu dans mon fichier a l'objet qui les représente dans le jeu .( au lieu de les affecter automatiquement en fonction d'un nom de ficher ( donnée menebre de cPersonnage par ex ... ) ou il se trouverai .

    ->Une fois ces considérations faites , il ne me reste plus qu'a entré dans le vif du sujet

    voici le type de dialogue a charger .
    dialogue21.txt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    FontName = Texte Dialogue 
    Texte ="[Color = 255;0;0;1 ] !! [/Color] : Hey je suis je heureux de te rencontré !
            [Bold] HAAAAAaa [/Bold] ca fait si longtps :) "
    -> simplification suivante, plsu tard, quand je "parserai" ce genre de choses, FontName = texte Dialogue, me renverrai a un fichier font.txt qui contiendra entre autre .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    FontName = Texte Dialogue 
    Nom = Thryomanes normal
    Taille = 16
    Bold = 0
    Italic = FALSE
    Underline = FALSE
    pour simplifier encore, au moment ou je devrai créer ma police dans le jeu, j'affecterai arbitrairement les valeur ci-dessous a mon objet, au lieu de les lire sur le fichier en question .

    On continue pour ceux qui me suivent encore

    ~~~ A partir d'ici je n'ai rien codé ~~~
    Je pense créer une classe cDiablogueTexte . ( notre classe princiaple ( au lieu de cPersonnage) contiendra un objet cDialogueTexte .

    Cette classe aura entre autres en donnée menbre :

    un cTexteBrut texte ; ( une classe ne contenant basiquement que le texte non formaté dans un obje menbre string ( std::string brut ) )

    un cFont * font ; ( un pointeur vers un font, chargé en mémoire précédement )

    un int mode ; pour faire simple, deux entier x et y représentant la position du texte ( on va se limiter a une/deux ligne pour le début . )

    donc dans notre exemple on aura qquchose du style , une methode init(); a la création du cDialogue )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    void init()
    {
     texte.brut ="[Color = 255;0;0;1 ] !! [/Color] : Hey je suis je heureux de te rencontré !
            [Bold] HAAAAAaa [/Bold] ca fait si longtps :) ";
    y = 200 ;
    x = 200 ; //texte en (200,200 )
    font = cRessourcesManager::GetInstance().get<cFont>("Texte Dialogue") ;
    }
    Ensuite, je ne sais pas trop ... en fait je m'enbrouille énormément .( alors que je ne suis peut-etre pas si loin de la solution .... )

    Enfin derniére chose : je ne sais aps encore comment gérer mes deux grandes methode ( upadete() et draw() ; je pense que pour update() j'ai encore un peu temps devant moi ; mais pour draw() ... il va faloir que je fasse qquchose de propre et vite :p

    Si vous avez des idées conseils, je suis preneur ; je pense en ce moment a faire une classe spéciale, contenant un conteneur ( de la STL ); ce conteneur contiendra des objets qui posséderont tous une methode draw ; et en gros, a chaque frame, je fait un draw récursif sur tout les elt de ce conteneur ....

    enfin /me a besoin d'aide :p
    Je sais que mon msg est assez vague mais bon :/ je posterai bien toutes mes classe, mais il y en bas une bonne 20aine et sans une seule d'entre elle on risque de vite perdre le fil ...

  2. #2
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Par défaut
    Je sais que mon msg est assez vague mais bon :/ je posterai bien toutes mes classe, mais il y en bas une bonne 20aine et sans une seule d'entre elle on risque de vite perdre le fil ...
    A message vague, réponse vague...

    Tu es encore à l'étape de l'analyse, et j'ai plutôt l'impression que tu es sur la bonne voie.

    Il y a plusieurs façons de faire ce que tu veux, mais mis à part participer à ton projet, on ne peut pas te pondre l'analyse à ta place. D'ailleurs je trouve la présentation trop vague...

    Tu manques peut-être d'expérience dans la réalisation d'un projet de A àZ, alors le seul conseil que je te donnerai dans ce cas c'est lances-toi.

    Un autre conseil c'est de regarder les codes sources de jeu qui correspondent au tien et de voir l'organisation générale du programme. Et bien sur de t'en inspirer.

    Sinon je verrais plutôt ta question dans le forum DirectX. Il y a plus de personne du monde du jeu vidéo qui pourront te donner des conseils, parce que si c'est juste une question d'organisation de tes classes, va falloir être plus précis.

  3. #3
    Membre chevronné
    Avatar de rolkA
    Inscrit en
    Juillet 2003
    Messages
    324
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 324
    Par défaut
    Je te conseille ce livre (en anglais):
    http://www.amazon.com/exec/obidos/tg/detail/-/159200315X/104-0318244-5449539?v=glance

  4. #4
    Membre éclairé
    Inscrit en
    Octobre 2004
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 616
    Par défaut
    J'avoue ... on a vu nettemnt + constructif / clair comme msg que le mien .... mais bon j'était parti sur ma lancée lol ^^

    Merci pr les critique, j'en prend bonne notes ( je sui toujours ouvert aux critiques ( pour peu qu'elles soit constructive ) )
    En fait je crois que je vais continuer commme ca pour le moment !

    Quand au lien de rolkA je vais y jeter un oeil de suite !
    merci

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Août 2003
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 247
    Par défaut
    Un problème difficile, c'est dur à résoudre. Un problème facile, c'est simple. Deux problèmes faciles, c'est toujours simple. Plusieurs problèmes faciles, ça peut devenir long à résoudre, mais c'est simple.

    Le secret est donc une architecture de classe bien pensée qui divise le problème difficile qu'est la programmation d'un jeu en classes remplissant une fonction simple. Par exemple, il est évident que tu dois séparer les fonctions d'affichage, des fonction gérant les interactions entre les objets.

    Tu n'es pas obligé de tout prévoir, mais tu doit réfléchir aux grands modules de ton programme et leur interface. Sinon, tu seras obliger de tout reprendre à zéro périodiquement.

    Les interfaces sont en fait le seul point à définir tôt dans la conception : même si tu ne sais pas encore comment tu vas programmer un module, tu dois savoir comment tu vas l'utiliser pour commencer à programmer les autres modules. En termes pratiques, l'interface est l'ensemble des membres publics d'une classe.

    La notion d'interface appelle la notion d'héritage et d'abstraction.
    Ces deux notions permettent de définir des classes interfaces qui seront implémentée par d'autre classes. Ceci permet des constructions de ce genre:


    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
     
     
    /* Une scène d'un jeu est composé d'éléments, lesquels
     * doivent être dessinés ~environ 50 fois par seconde.
     * Cette classe représente ces éléments.
     */
    class item
    {
    public:
     
    	/* Cette fonction est appelée pour afficher
    	 * l'élément à l'écran.
    	 */
    	virtual void on_draw ( ) = 0;
     
    };
     
     
     
    /* Cette classe représente un personnage sur la scène du jeu.
     */
    class character : public item
    {
    public:
     
    	/* Cette classe implémente on_draw selon la 
    	 * manière spécifique de dessiner un personnage.
    	 */
    	virtual void on_draw ( )
    	{ 
    		/* Voici un problème simple à résoudre :
    		 * dessiner un personnage.
    		 */
    	}
     
    };
     
     
     
    /* Cette classe représente le décor.
     */
    class background : public item
    {
    public:
     
    	/* Cette classe implémente on_draw selon la 
    	 * manière spécifique de dessiner un décor.
    	 */
    	virtual void on_draw ( )
    	{ 
    		/* Voici un second problème simple à
    		 * résoudre : dessiner un décor.
    		 */
    	}
     
    };
     
     
     
     
     
    /* Là ça devient interessant.
     * Le moteur de jeu remplit ce vector avec
     * tout les éléments de la scène.
     * Comme character hérite de item, il est
     * possible d'assigner un character* à une
     * variable item*.
     */
    std::vector<item*> items;
     
     
     
    /* Et le moteur graphique fait ça.
     */
    for ( std::vector<item*>::iterator i = items.begin() ; i != items.end() ; ++i )
    {
    	i->on_draw( );
    }
     
    /* Et la scène apparait.
     */

    [edit]Je viens de voir que tu avais déjà penser à ce type d'architecture ;-)[/edit]


    Ceci est un exemple d'architecture de classe bien pensée. Les dépendances entre les modules sont très réduites (le moteur graphique doit juste connaitre l'interface item), tu peux donc ajouter un nouveau type d'objet sans même toucher au moteur graphique. Bien sûr, rine n'interdit de continuer l'arborescence des classe en définissant par exemple les classes répresentant le personnages principal, les monstres, etc, toutes dérivant de character.


    Pour ton problème de dialogue, tu peut faire comme ceci. Ta classe dérivant de character qui demande la parole après l'appel d'une de ses méthodes on_event appelle un fonction tu moteur de jeu: speak en passant en paramètre l'identifiant (qui peut être aussi bien un nombre, qu'un titre, etc) de la tirade. speak récupère la tirade via le module de récupération des données (Division des problème, la récupérations données est un autre problème. De plus, tu sera bien content de l'avoir encapsulé quand tu voudras changer de format de donnée.) et crée un objet text dérivant de item. speak peut éventuellement mettre le moteur de jeu dans un mode spécial qui arrète le jeu (très facile à faire puisque tout est modulaire ;-)).



    Voilà, j'ai dit ce que à peu près j'avais à dire. A défaut de t'avoir appris quelque chose, ce texte éclairera peut-être quelques lanternes.

  6. #6
    Membre éclairé
    Inscrit en
    Octobre 2004
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 616
    Par défaut
    merci bien, ca me rapelle pas mal de choses et je pense ne pas être loin de ce que tu décrit en ce moment . il ma manque juste a, comme tu le conseil, regarder un peu mieux ce qui se passera au tout début de la chaine

    En ce qui conerne le probleme de dialogue , j'ai fait quelque progrés .
    Tout d'abord, j'ai dans ma fonction principale de dessein, un apelle a une methode qui va boucler sur une map, pour afficher tout les élément qui doivent l'être.

    Pour faire simple je n'ai qu'un seul objet " un cTexteDialogue" .

    Tout marche assez bien, j'arrive a afficher une chaine de caractére, dans une police donnée .

    Je vais passez maintenant au formatage du texte ( avec les balises que j'aurais dans ma tirade ... du style color, bold ect .... )

    En fait ce qui me faisait peur, c'est que j'ai a peu rpés la version finale de ce que je veut conernant le mode de texte, et que j'en suis TRES loin
    Mais bon, en y allant petit a petit ... ca devrais allez je pense !

    en tout cas, merci de me faire partager ton point de vue, c'est toujours trés enrichissant !!

  7. #7
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Je n'ai parcouru que très rapidement, en diagonale et les yeux fermés, donc si je répond à côté, c'est normal...

    J'ai un peu l'impression que tu te diriges vers un truc un peu trop limité, à la structure trop rigide. J'ai l'impression qu'il pourrait être utile de définir plus qu'une simple structure de données un langagé dédié au sujet, et qui te permettra de coder simplement des choses comme :

    Si le joueur a tué plus de 5 dragons et a un talent en pipotage de 10, alors déclancher la quête du gros bill

    C'est ce genre de chose qui te permettra de séparer le moteur du jeu de la création des niveaux.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  8. #8
    Membre éclairé
    Inscrit en
    Octobre 2004
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 616
    Par défaut
    hum, mon but est justement d'arriver a quelquechose qui se manie bien juste a l'aide de script ect ...
    Pour le moment, je fait les bases, donc c'est normal que ca paraissent assez rigide ( c'est le cas d'ailleur ) ; mais j'espére que plus je vais continuer, plus ca va devenir souple ^^

    Pour l'exemple de mes dialogue par ex, je suis parti de rien, UNE ligne de code qui servait a afficher une phrase dans un style donné a un endroit donné ( rien de paramétrable ) . Et la je suis entrain de gérer ( non sans mal lol ) le formatage du text, la possibilité d'y inclure des variables ect ... tout ca a partir d'un fichier texte
    Plus tard, ces dialogue seront juste écrit a la main dans un fichier texte , ou alors a l'aide d'un petit editeur spécialisé . C'est ca mon but :p

    Enfin j'en suis loin, et la route est encore longue ... mais je pense que je me rendrait vite compte de mes éventuelle erreurs de jugement / facons de faire ( comme ca m'est déja souvent arrivé par le passé)

    Enfin merci pour le commentaire , j'en prend bonne note !

Discussions similaires

  1. Réponses: 10
    Dernier message: 27/03/2015, 07h49
  2. Architecture de programme
    Par boby666 dans le forum C
    Réponses: 3
    Dernier message: 02/01/2008, 20h58
  3. architecture logiciel programmation systeme
    Par k-eisti dans le forum Linux
    Réponses: 1
    Dernier message: 22/11/2007, 14h46
  4. Programmation en architecture distribué
    Par mobscene dans le forum Langage
    Réponses: 7
    Dernier message: 16/01/2007, 16h27
  5. architecture d'un programme client/serveur asynchrone (win)
    Par Heimdall dans le forum Développement
    Réponses: 2
    Dernier message: 05/09/2003, 23h59

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