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 :

[C++][OSG] Urban Shooter


Sujet :

Projets

  1. #1
    Membre éprouvé
    Avatar de Ange_blond
    Homme Profil pro
    Ingénieur développement en 3D temps réel
    Inscrit en
    Mars 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement en 3D temps réel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 902
    Points : 1 179
    Points
    1 179
    Par défaut [C++][OSG] Urban Shooter
    Bonjour a tous.

    Hee oui je me lance comme tant d'autres dans un projet de jeu (étonnant n'est ce pas )

    Pourquoi ce projet ?

    Je vais faire simple : maitrisant depuis environ 2 ans la bibliotheque OpenSceneGraph et étant un des plus actifs de la rubrique OSG du forum, je pense que de montrer OSG en action peut etre plus efficace que n'importe quel tuto (pi bon, c'est plus marrant a écrire qu'un tuto aussi hein )
    (Pour mémo, OSG est une bibliotheque 3D openSource www.openscenegraph.org)

    Technologies et outils de développement :

    C++
    OSG www.openscenegraph.org

    Visual Studio 9 express
    Bouml (modelisation UML) http://bouml.fr/
    Google code (dépot svn) code.google.com
    Doxygen (documentation) http://www.stack.nl/~dimitri/doxygen/


    Encore un projet de FPS parmis tant d'autres ?

    Ben... disons oui
    Il s'agit donc dans un premier temps d'un preuve de concept plus que de la réalisation d'un jeu.
    Celà dit, il faut bien un sujet quand meme, une ligne directrice... alors je vais faire quelque chose d'original, un truc révolutionnaire qui va me faire gagner des sous, créer mon entreprise, et meme conquerir le monde !!!

    Bon ok je m'emballe, disons que je vais viser un simple FPS pour le moment, surement basé sur le snipe (bha on a tous ses petites preferences hein )

    Ce projet n'est pas une premiere, on a tous dejà entamé des poignés de projet sans les aboutir (en tout cas c'est mon cas )
    Cette fois, disons juste que je le sens bien



    J'ai mis le code sur un dépot google code, mais inutile de vous presser voir les sources, pour le moment il n'y a presque rien, déjà, et de toute maniere c'est le bazard et ça ressemble a rien...
    Bien sur, quand j'aurais du code présentable et stable, vous l'aurez aussi

    Je vous invite donc a me questionner, me critiquer, me conseiller, m'orienter, etc...

    (Ce post sera mis a jour avec le dépot du code et tout autre informations utile)
    "le langage C permet de tout faire, y compris se tirer dans le pied. Le langage C++ permet de tout faire, y compris se tirer dans le pied - et réutiliser la balle"

  2. #2
    Membre éprouvé
    Avatar de Ange_blond
    Homme Profil pro
    Ingénieur développement en 3D temps réel
    Inscrit en
    Mars 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement en 3D temps réel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 902
    Points : 1 179
    Points
    1 179
    Par défaut
    Pour ce premier post, je vais juste introduire mon travail actuel, à savoir le HUD http://fr.wikipedia.org/wiki/Afficha..._vid%C3%A9o%29

    Le HUD que je cherche a faire ne va pas contenir des informations de munition, mais "juste" des informations textuelles.

    Comme j'aime bien faire du code réutilisable, je vais donc faire une sorte de HUD qui pourra me servir a déboguer par la suite.

    Mon idée est la suivante :
    Ce HUD affichera dans le coin en bas a gauche une liste de textes sur fond transparent. Chaque nouveau texte sera affiché en tete ou fin de pile (verticale la pile) et s'affichera dynamiquement : tous les autres textes seront déplacés en translation verticale pour "laisser la place" au nouveau texte, et quand un texte expirera (durée fixe identique pour chaque texte) il se "dépilera" avec un effet de transparence jusqu'a disparaitre.

    (bon dit comme ça c'est peut etre pas tres clair, mais quand j'en aurais fini vous verrez :p )

    J'ai commencé une conception avec BOUML que je découvre au fur et à mesure.
    Comme c'est un outil que je ne maitrise pas du tout (l'UML) je risque de prendre un peu de temps et de tout reprendre plusieurs fois, mais pour une fois j'aimerais bien faire les choses.


    Notions et classes OSG utilisées :
    • osg:: PositionAttitudeTransform
    • osgText
    • osg::NodeCallback
    • osg::Timer
    • Effets de transparence
    "le langage C permet de tout faire, y compris se tirer dans le pied. Le langage C++ permet de tout faire, y compris se tirer dans le pied - et réutiliser la balle"

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    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 860
    Points : 219 064
    Points
    219 064
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Tout d'abord, je vous encourage à fond pour votre projet

    Maintenant, j'ai déjà des critiques . Pourquoi ne pas mettre comme lien wikipedia, directement la bonne page ( http://fr.wikipedia.org/wiki/Afficha..._vid%C3%A9o%29 )

    Et pour votre HUD, prevoyez la couleur de texte ( car c'est cool de voir les affichages importants et les autres moins importants ou moins contrariants )
    Et puis ... si je peux me permettre, peut être que vous devez faire un système de log, qui d'une certaine manière pourra diriger des messages sur le HUD, et non seulement ne console ou autre fichier ... enfin ceci est une idée.

    Et pour vous aider, les cours et tutoriels C++ : http://cpp.developpez.com/cours/

    ( Il fallait que je post pour m'abonner )

    Bon courage
    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.

  4. #4
    Membre éprouvé
    Avatar de Ange_blond
    Homme Profil pro
    Ingénieur développement en 3D temps réel
    Inscrit en
    Mars 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement en 3D temps réel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 902
    Points : 1 179
    Points
    1 179
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    Maintenant, j'ai déjà des critiques . Pourquoi ne pas mettre comme lien wikipedia, directement la bonne page ( http://fr.wikipedia.org/wiki/Afficha..._vid%C3%A9o%29 )
    voilà ^^ merci pour le lien

    Citation Envoyé par LittleWhite Voir le message
    Et pour votre HUD, prevoyez la couleur de texte ( car c'est cool de voir les affichages importants et les autres moins importants ou moins contrariants )
    Bonne remarque, je vais noter ça

    Citation Envoyé par LittleWhite Voir le message
    Et puis ... si je peux me permettre, peut être que vous devez faire un système de log, qui d'une certaine manière pourra diriger des messages sur le HUD, et non seulement ne console ou autre fichier ... enfin ceci est une idée.
    OSG a dejà un systeme de Log avec priorité, je vais l'utiliser sans ménagement.

    Citation Envoyé par LittleWhite Voir le message
    ( Il fallait que je post pour m'abonner )
    Menteur ^^ On peut s'abonner sans poster


    Bon sinon voilà mon premier brouillon de la conception
    Images attachées Images attachées  
    "le langage C permet de tout faire, y compris se tirer dans le pied. Le langage C++ permet de tout faire, y compris se tirer dans le pied - et réutiliser la balle"

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    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 860
    Points : 219 064
    Points
    219 064
    Billets dans le blog
    120
    Par défaut
    J'ai aussi un peu regarder le code ... certains diront que l'utilisation des Singletons c'est le mal ( enfin, quand y en a plus d'un ... ), d'autres diront que ces bons. Perso je ne sais pas. Mais si vous êtes amené à en faire plusieurs ( et je suis sur, vous serez ), je vous conseille ce tuto: http://loulou.developpez.com/tutorie.../partie1/#L3.4

    Pour OSG, je ne connais pas, mais un jour je me pencherai dessus ( peut être lorsque mon dos se courbera ). Mais c'est cool, qu'il y a un logger de base

    Et pour les ressources ainsi que pour les tests, vous allez faire comment ? vous avez des mondes 3D dans les poches ?
    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. #6
    Membre éprouvé
    Avatar de Ange_blond
    Homme Profil pro
    Ingénieur développement en 3D temps réel
    Inscrit en
    Mars 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement en 3D temps réel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 902
    Points : 1 179
    Points
    1 179
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    J'ai aussi un peu regarder le code ... certains diront que l'utilisation des Singletons c'est le mal ( enfin, quand y en a plus d'un ... ), d'autres diront que ces bons. Perso je ne sais pas. Mais si vous êtes amené à en faire plusieurs ( et je suis sur, vous serez ), je vous conseille ce tuto: http://loulou.developpez.com/tutorie.../partie1/#L3.4
    J'ai lu en diagonale pas mal de cours et tutoriels sur la question... moi je soutient que les singletons de type "manager" ça reste tres utile et ça rend le code plus lisible.
    Je compte en garder au moins 1 pour acceder aux différents elements (HUD, SON, Effets, etc...)

    Citation Envoyé par LittleWhite Voir le message
    Et pour les ressources ainsi que pour les tests, vous allez faire comment ? vous avez des mondes 3D dans les poches ?
    Pour le moment j'en suis pas à avoir besoin de modeles 3D...
    Et quand le temps viendra, je prévois de les faire moi meme pour le moment ou de les trouver sur le net (pas tres difficile de trouver un fusil ^^ )
    "le langage C permet de tout faire, y compris se tirer dans le pied. Le langage C++ permet de tout faire, y compris se tirer dans le pied - et réutiliser la balle"

  7. #7
    Membre éprouvé
    Avatar de Ange_blond
    Homme Profil pro
    Ingénieur développement en 3D temps réel
    Inscrit en
    Mars 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement en 3D temps réel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 902
    Points : 1 179
    Points
    1 179
    Par défaut
    Dans un premier temps, je vais me contruire un petit syteme de callback multiples.
    En effet, OSG ne gere qu'un callback par node, ce qui implique parfois de devoir tricher (rajouter un node intermédaire dans le graph pour lui mettre un 2d callback).

    Dans un soucis de faire du code propre et efficace, je vais donc créer un systeme de callbacks surchargés pour pouvoir empiler autant de callback que voulu sur un meme node.

    Bien sur, ces sources seront disponibles sur le dépot (dont je mettrai l'adresse vous inquietez pô )
    "le langage C permet de tout faire, y compris se tirer dans le pied. Le langage C++ permet de tout faire, y compris se tirer dans le pied - et réutiliser la balle"

  8. #8
    Membre éprouvé
    Avatar de Ange_blond
    Homme Profil pro
    Ingénieur développement en 3D temps réel
    Inscrit en
    Mars 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement en 3D temps réel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 902
    Points : 1 179
    Points
    1 179
    Par défaut
    Heee non je n'ai pas déjà abandonné ^^

    Mon systeme de callbacks est implémenté, mais il me reste à l'éprouver.
    Pour ce faire, j'ai mis en place des Test Unitaires

    J'utilise Cpp Unit.
    Plus précisément voilà comment je met en place mes Unit tests sur mon code :
    Je créé un nouveau projet Visual Studio, un executable, dans lequel je met mon "main" des Unit Test.
    J'ajoute dans les fichiers les sources (header et cpp) que je veux tester. Il faudra bien les compiler, et je veux éviter de faire une lib avec les quelques 5-6 objets que je veux tester.
    Enfin, j'ajoute donc mes classes de test qui vont faire souffrir mon code, et au final me rendre un rapport.


    Plus clairement : un nouveau projet visual, dans la meme solution, permet en l'activant ou non de lancer des tests tres facilement. Il suffit de changer de projet de démarrage et au lieu d'executer votre code, vous executez les tests sur votre code.


    Pour le code des tests, c'est toujours sur le meme dépot : http://code.google.com/p/urbanshoote.../Tests/sources


    C'est encore un peu en chantier, pour le moment j'ai juste mis en place la structure de test, mais une fois ceci fait, ça devrait aller assez vite pour écrire les tests.


    Pour les curieux, il y a un (des?) tutos sur les Unit tests avec CppUnit syr developpez.com http://matthieu-brucher.developpez.c...s/cpp/cppUnit/



    (Oui je sais, je parlote beaucoup et code peu mais faut dire que je suis passé au smartphone depuis peu alors forcément... faut bien s'amuser un peu dans la vie hein )

    PS : le dépot google code est a présent sur la page de présentation du projet
    Edit : ben en fait non, je ne peux éditer que ce post et aucun des précédent , quelqu'un saurait pourquoi ?
    En attendant... vl'a le dépot : http://code.google.com/p/urbanshooter/
    "le langage C permet de tout faire, y compris se tirer dans le pied. Le langage C++ permet de tout faire, y compris se tirer dans le pied - et réutiliser la balle"

  9. #9
    Membre habitué
    Profil pro
    Dev
    Inscrit en
    Mai 2009
    Messages
    257
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Mai 2009
    Messages : 257
    Points : 190
    Points
    190
    Par défaut
    tu vises quelle qualité graphiquement parlant ?

    parce que j'ai jeté un coup d'oeil à quelques screens d'OSG et ça n'a pas l'air dément

    je me demande même si c'est fait pour les jeux

    bon après je n'ai pas ton expérience sur ce framework donc je me garde de juger hâtivement

    PS : juste pour savoir, quel est ton parcours universitaire ?

  10. #10
    Membre éprouvé
    Avatar de Ange_blond
    Homme Profil pro
    Ingénieur développement en 3D temps réel
    Inscrit en
    Mars 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement en 3D temps réel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 902
    Points : 1 179
    Points
    1 179
    Par défaut
    Citation Envoyé par coda_blank Voir le message
    tu vises quelle qualité graphiquement parlant ?

    parce que j'ai jeté un coup d'oeil à quelques screens d'OSG et ça n'a pas l'air dément

    je me demande même si c'est fait pour les jeux
    OSG n'est un equivalent a un cryEngine c'est sur... c'est pas dédié aux jeux, mais plutot à la 3D temp réel. Donc je ferai de mon mieu niveau qualité, mais c'est sur que ça ne sera pas à la hauteur des rendus derniere generation...

    Citation Envoyé par coda_blank Voir le message
    PS : juste pour savoir, quel est ton parcours universitaire ?
    Ecole d'ingénieur en informatique, spécialité I2RV (Imagerie, Interaction et Réalité Virtuelle)
    "le langage C permet de tout faire, y compris se tirer dans le pied. Le langage C++ permet de tout faire, y compris se tirer dans le pied - et réutiliser la balle"

  11. #11
    Membre habitué
    Profil pro
    Dev
    Inscrit en
    Mai 2009
    Messages
    257
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Mai 2009
    Messages : 257
    Points : 190
    Points
    190
    Par défaut
    Citation Envoyé par Ange_blond Voir le message
    OSG n'est un equivalent a un cryEngine c'est sur... c'est pas dédié aux jeux, mais plutot à la 3D temp réel. Donc je ferai de mon mieu niveau qualité, mais c'est sur que ça ne sera pas à la hauteur des rendus derniere generation...
    je pensais plutot à la catégorie des moteurs de rendu opensource comme Ogre...

    Ecole d'ingénieur en informatique, spécialité I2RV (Imagerie, Interaction et Réalité Virtuelle)
    ok

  12. #12
    Membre éprouvé
    Avatar de Ange_blond
    Homme Profil pro
    Ingénieur développement en 3D temps réel
    Inscrit en
    Mars 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement en 3D temps réel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 902
    Points : 1 179
    Points
    1 179
    Par défaut
    Ce soir je me suis attelé a ces fameux Unit Tests sur mon manager de callbacks.

    En effet, il s'avere plus facile de tester mon code via la mise en place de Unit Tests (meme si c'est plus lourd en terme de code) d'une part parce que c'est plus "sain" a rédiger (j'entend par là que ce n'est pas juste un bout de code a l'arrache qui sera commenté par la suite) et parce que c'est plus facile a gerer (et là je veux dire que maintenant que les tests sont écrits, ils le sont pour toute la durée de la classe, et sont modifiable comme n'importe quel morceau de code lorsque celui ci évoluera)

    La mise en place de ces tests m'a permis de relever dejà 2 améliorations futures :
    • le removeCallback n'ote que la premiere instance rencontrée du callback a retirer. Je vais donc ajouer un booléen facultatif en argument pour retirer ou non toutes les instances. (Ben oui, c'est parfois pratique de mettre plusieurs instances du meme callback sur un node, surtout depuis qu'on peut en mettre autant qu'on en veut !)
    • le add ajoute le nouveau callback en fin de la liste. Néanmoins, l'ordre étant tres important pour les callbacks, il me semble judicieux de proposer l'ajout n'importe où dans la liste (avec un index en argument, 0 étant la tete, et un indice >= à la taille de la liste étant la queue)


    Et donc, une fois les tests écrits, on fait tourner et Hop :
    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
    <?xml version="1.0" encoding='ISO-8859-1' standalone='yes' ?>
    <TestRun>
      <FailedTests></FailedTests>
      <SuccessfulTests>
        <Test id="1">
          <Name>CallbackManagerTest::add</Name>
        </Test>
        <Test id="2">
          <Name>CallbackManagerTest::remove</Name>
        </Test>
      </SuccessfulTests>
      <Statistics>
        <Tests>2</Tests>
        <FailuresTotal>0</FailuresTotal>
        <Errors>0</Errors>
        <Failures>0</Failures>
      </Statistics>
    </TestRun>
    (Il y a actuellement 5 assertions sur 2 tests)

    Vous pouvez retrouver le code des tests :



    Et un petit exemple de test foiré juste pour les curieux :
    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
     
    <?xml version="1.0" encoding='ISO-8859-1' standalone='yes' ?>
    <TestRun>
      <FailedTests>
        <FailedTest id="2">
          <Name>CallbackManagerTest::remove</Name>
          <FailureType>Assertion</FailureType>
          <Location>
            <File>.\sources\CallbackManager\CallbackManagerTest.cpp</File>
            <Line>116</Line>
          </Location>
          <Message>assertion failed
    - Expression: _group-&gt;getName().compare(&quot;121111111112&quot;) == 0
    </Message>
        </FailedTest>
      </FailedTests>
      <SuccessfulTests>
        <Test id="1">
          <Name>CallbackManagerTest::add</Name>
        </Test>
      </SuccessfulTests>
      <Statistics>
        <Tests>2</Tests>
        <FailuresTotal>1</FailuresTotal>
        <Errors>0</Errors>
        <Failures>1</Failures>
      </Statistics>
    </TestRun>

    A suivre : l'amélioration des points levés plus tôt, et suite de l'implémentation du HUD.

    Bien entendu, si certains sont interessés par cette nouvelle possibilité d'utilisation des callbacks, faites moi signe je vous expliquerai comment ça marche (parce que meme si le code est propre -j'espere-, il faut néanmoins utiliser une petite macro bien placée dans les callbacks pour que ça marche parfaitement)
    "le langage C permet de tout faire, y compris se tirer dans le pied. Le langage C++ permet de tout faire, y compris se tirer dans le pied - et réutiliser la balle"

  13. #13
    Membre éprouvé
    Avatar de Ange_blond
    Homme Profil pro
    Ingénieur développement en 3D temps réel
    Inscrit en
    Mars 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement en 3D temps réel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 902
    Points : 1 179
    Points
    1 179
    Par défaut
    Ce soir, comme "promis" je viens d'améilorer mon callback Manager, qui permet a présent l'insertion de callback n'importe où dans la liste, et la supression de toutes les instances d'un meme callback.

    Ca se présente ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void CallbackList::addCallback( osg::NodeCallback * callback, int index)
    {
    	if( index < 0 || index >= (int)_callbackList.size() )
    	{
    		_callbackList.push_back(std::make_pair(callback->className(), callback));
    	}
    	else
    	{
    		//put iterator on next element before insertion
    		CallbackCallList::iterator it = _callbackList.begin() + index;
    		_callbackList.insert(it , std::make_pair(callback->className(), callback));
    	}
    }
    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
    void CallbackList::removeCallback( const std::string & name, bool remove_all_instances)
    {
     
    	for(CallbackCallList::iterator it = _callbackList.begin(); it != _callbackList.end() ; )
    	{
    		if(it->first.compare(name) == 0)
    		{
    			//no incrementation in this case
    			it = _callbackList.erase(it);
     
    			if(!remove_all_instances)
    				return;
    		}
    		else
    			++it;
    	}
     
    }
    Avec toujours la meme interface :

    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
    /** 
     *      \class CallbackManager
     *      \brief Class to manage the callback list on each node instead of the user himself
     */
    class CallbackManager
    {
    public:
     
    	/** 
             *      Add a callback on a node callback's list
             *      @param[in] node node where to add the callback
             *      @param[in] callback callback instance to add on node
             *      @param[in] index callback index in the index list. From 0 to n. if n > size of the list, callback will be added
             *      in queue. -1 is for add in queue.
             */
    	static void addNodeCallback(osg::Node * node, osg::NodeCallback * callback, int index = -1);
     
    	/** 
             *      Remove a callback on a node callback's list
             *      @param[in] node node where to remove the callback
             *      @param[in] name classname of the callback
             *      @param[in] all_instances remove all instances of this callback, or just the first one.
             */
    	static void removeNodeCallback(osg::Node * node, const std::string & name, bool all_instances = false);
     
    };
    Bien sur, j'ai mis a jour les Unit tests pour couvrir 100% du code (de cette classe hein, pas de tout le code ! )

    Voilou, je pense que j'en ai fini avec ce callback manager. (pour le moment )

    Je vais reprendre un peu de recul et reprendre le HUD, a commencer par les callbacks d'animation des textes.
    "le langage C permet de tout faire, y compris se tirer dans le pied. Le langage C++ permet de tout faire, y compris se tirer dans le pied - et réutiliser la balle"

  14. #14
    Membre éprouvé
    Avatar de Ange_blond
    Homme Profil pro
    Ingénieur développement en 3D temps réel
    Inscrit en
    Mars 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement en 3D temps réel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 902
    Points : 1 179
    Points
    1 179
    Par défaut
    Bonsoir,

    Je viens de customiser encore un peu mon manager de Callback : en effet, pour els callback qui s'auto-détruisent apres utilisation, la liste de callbacks n'est pas mise a jour.

    Alors je passe sur les détails, mais apres la correction les Unit Tests m'ont remonté 2 erreurs, que j'ai pu corriger sans mal le code étant encore tout chaud.

    Je peux vous dire que tout d'un coup, je suis convaincu de l'utilité de tests unitaires, car je viens de gagner un temps de débogage considérable !
    Si j'étais tombé sur ces bugs 1 mois plus tard, j'en aurais fait une gueule...


    Sinon, j'ai implémenté des callback, à savoir un callback de transparence et un d'animation :

    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
     
    	/** Constructor
             *      @param[in] goal position to get at the end of the duration
             *      @param[in] duration of the translation
             */
    	TranslationCallback(osg::Vec3d goal, double duration);
     
     
    	/** Constructor
             *      @brief This Callback Have to be set by user, but it removes it itself from the node callback list
             *      @param[in] alphaFrom transparency begin level
             *      @param[in] alphaTo transparency end level
             *      @param[in] durationVisible delay before starting to make it transparent (in second)
             *      @param[in] durationBlur duration to make the transparency go from alphaFrom to alphaTo
             */
    	ProgressiveTransparencyCallback(double alphaFrom = 1., double alphaTo = 0., double durationVisible = 2.0, double durationBlur = 2.0);

    Ils me serviront à animer l'insertion et la suppression des textes sur le Hud.
    "le langage C permet de tout faire, y compris se tirer dans le pied. Le langage C++ permet de tout faire, y compris se tirer dans le pied - et réutiliser la balle"

  15. #15
    Membre éprouvé
    Avatar de Ange_blond
    Homme Profil pro
    Ingénieur développement en 3D temps réel
    Inscrit en
    Mars 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement en 3D temps réel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 902
    Points : 1 179
    Points
    1 179
    Par défaut


    De retour !

    Pour ma défense j'ai eu beaucoup de travail ces dernieres semaines et par conséquent moins de temps libre et encore moins de motivation ...

    Mais je viens de réchauffer mon projet, avec cette fois ci un renforcement du code.
    Mon Hud est désormais plus sécurisé, permettant l'ajout de textes depuis n'importe quel threads. Le soucis était que l'ajout de textes de maniere désynchronisés était sujet à des soucis (recouvrement de textes).

    Pour ceci il m'a suffit d'ajouter une liste d'attente pour les textes ajoutés :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void HudManager::pushTextInList(const std::string & text)
    {
    	//lock the stack and push the message
    	OpenThreads::ScopedLock<OpenThreads::Mutex> mylock(_TestToAddStackMutex);
    	_textToAddStack.push(text);
     
    }
    Pour éviter les conflits d'acces, un petit mutex verouille l'acces à la stack, et de meme lorsque les textes en attente sont flushés pour etre affichés.

    J'ai tenté de faire une video pour vous montrer a quoi ça ressemble... mais camStudio m'a pas pris le rendu OSG... si jamais qqun à une idée de comment enregistrer...
    "le langage C permet de tout faire, y compris se tirer dans le pied. Le langage C++ permet de tout faire, y compris se tirer dans le pied - et réutiliser la balle"

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    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 860
    Points : 219 064
    Points
    219 064
    Billets dans le blog
    120
    Par défaut
    Cool, je me demandez où en était-ce...

    Sinon, ma question, c'est ... comment mettez vous le HudManager de façon global (tout les threads peuvent y acceder). Singleton ? Variable passer à travers le programme ? Ou méthode de programmeur Ninja que je ne connais pas ?

    Sinon ... je n'ai pas de réponse pour camStudio
    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.

  17. #17
    Membre éprouvé
    Avatar de Ange_blond
    Homme Profil pro
    Ingénieur développement en 3D temps réel
    Inscrit en
    Mars 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement en 3D temps réel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 902
    Points : 1 179
    Points
    1 179
    Par défaut
    Hehe oui parfois je fait juste mon flemmard

    Alors c'est ... surprise surprise... un singleton !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    HudManager::pushText(std::string("F1"));
    Tout betement...

    J'ai choisis ça parce que avec un simple include et un appel en une ligne on y a acces, et donc ça ne pollue pas le code.
    Tous les threads y ont donc acces.

    Sinon j'ai utilisé Fraps pour les video, ça va nettement mieux.
    Elles sont en cours d'upload... puis traitement... je les posterai dans quelques heures
    "le langage C permet de tout faire, y compris se tirer dans le pied. Le langage C++ permet de tout faire, y compris se tirer dans le pied - et réutiliser la balle"

  18. #18
    Membre éprouvé
    Avatar de Ange_blond
    Homme Profil pro
    Ingénieur développement en 3D temps réel
    Inscrit en
    Mars 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement en 3D temps réel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 902
    Points : 1 179
    Points
    1 179
    Par défaut
    Voilà le Hud, avec les deux modes de gestion des textes (en video )

    [ame="http://vimeo.com/19355574"]Hud OSG on Vimeo[/ame]

    [ame="http://vimeo.com/19355961"]HUD OSG on Vimeo[/ame]
    "le langage C permet de tout faire, y compris se tirer dans le pied. Le langage C++ permet de tout faire, y compris se tirer dans le pied - et réutiliser la balle"

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    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 860
    Points : 219 064
    Points
    219 064
    Billets dans le blog
    120
    Par défaut
    Sympe ... mais je pensais que c'était juste des textes sans cadre :p
    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.

  20. #20
    Membre éprouvé
    Avatar de Ange_blond
    Homme Profil pro
    Ingénieur développement en 3D temps réel
    Inscrit en
    Mars 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement en 3D temps réel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 902
    Points : 1 179
    Points
    1 179
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    Sympe ... mais je pensais que c'était juste des textes sans cadre :p
    En fait les cadre sont construit par une méthode virtuelle dans une fonction qui est là pour etre surchargée, donc chacun pourra choisir sa geometrie de background (entre autre choses)
    En fait tout l'aspect graphique est "surchargeable" ou configurable.
    "le langage C permet de tout faire, y compris se tirer dans le pied. Le langage C++ permet de tout faire, y compris se tirer dans le pied - et réutiliser la balle"

Discussions similaires

  1. Problème OSG et ODE!
    Par tyke91 dans le forum OpenSceneGraph
    Réponses: 2
    Dernier message: 09/09/2008, 01h59
  2. urban rival
    Par gretch dans le forum Web
    Réponses: 11
    Dernier message: 12/08/2007, 22h02
  3. Camera First Person Shooter
    Par Martin dans le forum OpenGL
    Réponses: 6
    Dernier message: 15/01/2004, 04h37

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