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

Développement 2D, 3D et Jeux Discussion :

Gestion des classes entre elles et organisation.


Sujet :

Développement 2D, 3D et Jeux

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 80
    Points : 30
    Points
    30
    Par défaut Gestion des classes entre elles et organisation.
    Bonjour à vous,

    Depuis pas mal de temps, je code un jeu en C++ reprenant le concept de la série des super smash bros de Nintendo.

    Le jeu fut recommencer pas mal de fois du à de nombreux changement de bibliothèques, ce qui m'a permis de progresser.

    Le principal problème est l'organisation, je ne vois jamais comment gérer les classes pour qu'elles puissent correctement communiquer entre elles.
    Par exemple : la classe physique est séparée de la classe audio, dans ce cas la comment savoir dans la classe audio quand un personnage est touché par un objet ?

    Pour vous donnez une idée des débuts du jeu voici l'éditeur de niveau ainsi qu'une démonstration du moteur physique :
    -> Moteur physique démonstration.
    -> L'éditeur de niveaux


    Actuellement, voici l'organisation du jeu :


    Explications :
    Moteur :
    Contient le jeu, me permettra d'ajouter un menu à la fin.

    Jeu :
    Contient un vecteur contenant tout les éléments du jeu (sols, caisses, ...), gère la relation entre les différentes classes (Physique, audio, joueur, ... )

    Joueur:
    Contient la position du joueur, ....

    Physique:
    La moteur physique gere les collisions entre les éléments du décors.

    J'aimerais gérer les collisions du joueur dans le moteur physique et non dans la classe joueur, mais je ne voit pas comment faire passer la position du joueur au moteur physique. Actuellement je passe par la classe "Jeu" qui récupère les informations puis les envois à la classe "Physique".

    - N'y a t-il pas un moyen de directement faire communiquer la classe joueur et la classe physique sans passer par la classe Jeu ?
    - Avez vous des codes sources clairs de jeu dans le même genre ? Afin de voir leur organisation.
    - Si je reprend l'exemple de la classe audio et la classe physique, comment savoir dans la classe audio si une caisse rentre en contact avec le sol ?
    - Que pensez-vous de mon moteur physique ( Lien plus haut ) ?


    Merci beaucoup à ceux qui auront pris le temps de me lire.
    Hybrix.

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Je pense que ton schéma n'est pas bon.

    Tu dois avoir d'un côté les modules de base de ton moteur, tous indépendants, et de l'autre les classes relatives au jeu en lui-même, qui font le lien entre les modules de base.

    Par exemple dans ton jeu tu as une classe Joueur, qui peut être notifiée par le moteur physique lorsque le joueur provoque une collision, et une fois notifiée elle peut jouer un son en utilisant le module audio.

    Mais en aucun cas la classe audio ne doit prendre la décision de jouer un son lorsqu'une caisse est tapée ! Elle ne doit rien savoir de ce qu'est la physique ni même une caisse, elle doit juste savoir jouer des sons, sans contexte particulier.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 80
    Points : 30
    Points
    30
    Par défaut
    Merci de m'avoir répondu,

    Mais je ne voit pas trop comment organiser tout ça.

    Si il y a une collision dans le moteur physique, je fait donc appel au moteur audio pour jouer le son, mais comment lui demande t-on de jouer le son si la classe Audio ne fait pas partie de la classe physique ?

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Non, ce n'est pas ce que j'ai dit. S'il y a une collision le moteur physique envoie une notification à la classe Joueur, et c'est elle qui demande au moteur audio de jouer le son correspondant. Ainsi, les moteurs physiques et Audio n'ont pas besoin de se connaître, c'est la classe Joueur qui fait le lien pour les besoins particuliers du jeu.

  5. #5
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Si tu veux quelque chose d'un peu plus concret, voilà à quoi ça pourrait ressembler :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class Joueur : public ElementPhysique
    {
        Joueur()
        {
            MoteurPhysique.AjouterElement(this);
        }
     
        // Héritée de ElementPhysique -- appelée à chaque fois qu'il y a contact
        virtual void OnContact(...)
        {
            MoteurAudio.JouerSon("bam.wav");
        }
    };
    Et un truc que j'ai oublié, je te conseille aussi la lecture de ce tutoriel :
    http://khayyam.developpez.com/articl.../architecture/

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 80
    Points : 30
    Points
    30
    Par défaut
    Arf ok j'ai compris.

    il faut donc que j'envoie le joueur dans chaque classes non ?

    Exemple:
    Je crée un vecteur std::vector<Joueur> joueur;

    Et je l'envoie dans chaque classe, ça reprend le principe des caisses et des décors.

    Admettons que dans le moteur physique le joueur saute, je met saute à 1, le moteur audio voit ensuite saute à 1 et joue alors le son.

    L'organisation sera correct comme ça non ?

    EDIT : je vient de voir ton exemple, mais je n'ai pas un super niveau en C++ donc je ne connais pas tout. Je vais me renseigner de mon coter.

  7. #7
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    A mon avis, si tu n'as pas le niveau pour comprendre le bout de code ci-dessus, tu vas bien galérer pour faire un jeu. Il faut une bonne connaissance du langage, surtout lorsque tu mets en jeu une architecture non triviale avec plusieurs modules.

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 80
    Points : 30
    Points
    30
    Par défaut
    Oui, j'en suis conscient, enfin j'essai d'en faire un principalement dans le but d'apprendre.

    Pour le moment je met en résolu, merci de m'avoir répondu .

  9. #9
    Membre actif Avatar de ironzorg
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 288
    Points : 245
    Points
    245
    Par défaut
    le moteur audio voit ensuite saute à 1 et joue alors le son
    C'est la qu'est le problème ! Le moteur audio n'a qu'une seule fonction: jouer du son ! Dans ce que tu nous dit, le moteur audio est capable de savoir si le joueur saute ou non et ce n'est pas bon.
    Il faudrait que tu fasses ça ( en schématisé, je ne tient as compte de ton schéma ):
    - La classe joueur appelle le moteur de collisions
    - Le moteur de collision dit a la classe joueur s'il y a une collision
    - S'il y a une collision, la classe joueur demande au moteur audio de jouer le son qui correspond a la collision.

    Et voila

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 80
    Points : 30
    Points
    30
    Par défaut
    Merci beaucoup d'avoir répondu,

    Pour le moment tout fonctionne parfaitement.
    J'utilise des fonctions statiques, comme Jean Christophe Beyler en utilise dans son tutoriel sur la création d'un pong , pour le moteur physique, audio, et graphique. (Lienvers la partie concerné).

    Malheuresement, je me retrouve confronté à un problème que je n'ai pas eu avec la partie Graphique :

    Je vient de commencer le moteur audio qui s'occupe seulement de jouer les sons et musiques comme vous me l'avez expliquer.

    Arriver à la compilation, aucune erreurs, mais au moment ou l'exécutable se lance, j'ai le message "It seems that this project has not built yet, do you want to build it now ?".

    Viennent ensuite les erreurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    -------------- Build: Debug in Smash2D ---------------
    Linking console executable: ..\..\bin\Smash_d.exe
    ..\..\obj\Debug\src\Audio.o: In function `ZN5Audio11chargerSonsEv':C:/Documents and Settings/Hybrix/Bureau/Smash-Jeu/src/Audio.cpp:13: undefined reference to `Audio::m_sonPiece'
    ..\..\obj\Debug\src\Audio.o: In function `ZN5Audio12prendrePieceEv':C:/Documents and Settings/Hybrix/Bureau/Smash-Jeu/src/Audio.cpp:21: undefined reference to `Audio::m_sonPiece'
    collect2: ld returned 1 exit status
    Process terminated with status 1 (0 minutes, 0 seconds)
    0 errors, 0 warnings
    Voici les fichiers Audio.cpp et Audio.h :

    Audio.h:
    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
    /**         Audio.h        **
    *
    *  Gère la partie audio du jeu.
    *
    **/
     
    #ifndef AUDIO
    #define AUDIO
     
    #include <iostream>
    #include <fmod.h>
     
    #include "define.h"
     
    class Audio
    {
    public:
        Audio();
        static bool chargerSons();
     
        // Jouer les sons.
        static void prendrePiece();
     
    private:
        static FSOUND_SAMPLE *m_sonPiece;
    };
     
     
    #endif
    Audio.cpp :
    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
    #include "Audio.h"
     
     
    FSOUND_SAMPLE Audio::*m_sonPiece = NULL;
     
    Audio::Audio()
    {
     
    }
     
    bool Audio::chargerSons()
    {
        m_sonPiece = FSOUND_Sample_Load(FSOUND_FREE, "../media/sounds/pieces.wav", 0, 0, 0);
     
        return true;
    }
     
     
    void Audio::prendrePiece()
    {
        FSOUND_PlaySound(FSOUND_FREE, m_sonPiece);
    }
    Merci à vous d'avoir pris le temps de m'avoir lu.
    Hybrix.

  11. #11
    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
    Le problème réside dans ta déclaration, il fallait faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FSOUND_SAMPLE* Audio::m_sonPiece = NULL;
    Jc

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 80
    Points : 30
    Points
    30
    Par défaut
    Merci beaucoup, désormais je saurait faire .

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 80
    Points : 30
    Points
    30
    Par défaut
    Me revoilà,

    Avec un problème bizarre
    J'ai terminé une petite démonstration, que j'ai mis en ligne :

    Le lien : ici
    (Tout est expliquer sur la page )

    Merci de me donner si possible votre avis au passage .

    Des personnes m'ont demander une version Linux, j'ai donc installé la distribution kubuntu, après avoir eu un mal fou à installer Devil, Fmod, SDL, Freetype, et réussi à installer internet, je me retrouve confronté à un problème bizarre :s.

    J'ai installer codeblock, linker les différentes bibliothèques, corriger un petit problème de segmentation qui n'apparaissait pas sous Windows .

    j'appuie sur F9 pour lancer la compilation puis le fichier crée, à ma grande surprise ce lance parfaitement, le plus dur est fait.

    Je test le fichier crée dans le dossier Bin par curiosité, et la le jeu se lance (changement de résolution mais écran noir), puis le jeu se coupe.

    Je ne voit pas du tout d'ou ça vient, je ne pense pas que ça vienne du code, le jeu se lance et se compile sans problèmes. y a t-il des fichiers (comme les .dll à inclure sous windows) avec le jeu ? enfin bref, j'ai voulu chercher sur le net, ce qui est difficile quand le problème est inéxpliquable.

    Merci d'avoir pris le temps de m'avoir lu.
    Hybrix.

  14. #14
    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 Hybrix
    Je ne voit pas du tout d'ou ça vient, je ne pense pas que ça vienne du code, le jeu se lance et se compile sans problèmes. y a t-il des fichiers (comme les .dll à inclure sous windows) avec le jeu ? enfin bref, j'ai voulu chercher sur le net, ce qui est difficile quand le problème est inéxpliquable.
    Non, mais cela sera difficile de donner un diagnostic sans le code source.

    Jc

  15. #15
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 80
    Points : 30
    Points
    30
    Par défaut
    Voici les sources : Ici

    J'ai essayer de supprimer la fonction "gestionJoueur" dans "Jeu.cpp", la fenetre reste ouverte, je voit le cadre crée à l'aide d'OpenGL, mais aucunes images ne s'affichent.

  16. #16
    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
    Il manque un Texte.h visiblement.

    Est-ce normal ?

    Jc

  17. #17
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 80
    Points : 30
    Points
    30
    Par défaut
    Oui, j'ai oublier de supprimer le .cpp

  18. #18
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 100
    Points : 150
    Points
    150
    Par défaut
    Citation Envoyé par Hybrix
    Des personnes m'ont demander une version Linux, j'ai donc installé la distribution kubuntu, après avoir eu un mal fou à installer Devil, Fmod, SDL, Freetype, et réussi à installer internet, je me retrouve confronté à un problème bizarre :s.
    Simple question un peu HS

    Comment tu t'y es pris pour installer Devil Fmod, SDL et freetype ?
    Normalement, y'a pas plus simple. En ligne de commande :
    sudo aptitude install libdevil-dev libsdl-dev libfreetype-dev

    ca devrait faire l'affaire (bon, ca serait ptet libfreetype4-dev, mais bon, dans l'idée, ca reste ca)
    Ou alors en passant par Adept. Mais ca revient au meme. Au pire, y'a Fmod qui n'est pas disponible de base. Mais bon ...

    C'est juste de la curiosité vu qu'a priori, ca a l'air de marcher un minimum

  19. #19
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 80
    Points : 30
    Points
    30
    Par défaut
    je débute sous linux (Très rarement utilisé avant), j'ai installé toutes les bibliothèques par Adept, exepté Fmod ou j'ai lu la doc.

  20. #20
    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 Hybrix
    je débute sous linux (Très rarement utilisé avant), j'ai installé toutes les bibliothèques par Adept, exepté Fmod ou j'ai lu la doc.
    Chez moi ton programme fonctionne bien que le comportement est un peu bizarre et saccadé mais bon j'ai l'image et les animations.

    J'ai vu qu'il manquait certains tests pour le chargement des textures (avec Devil) et du son (avec Fmod). Rajoute ces tests et regarde si cela ne pose pas des problèmes de ce côté là.

    Jc

Discussions similaires

  1. Faire communiquer des classes entre elles?
    Par aurelie689 dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 02/05/2009, 11h46
  2. Utilisation des classes entre elles
    Par leodi dans le forum Flash
    Réponses: 1
    Dernier message: 17/05/2008, 16h20
  3. Réponses: 3
    Dernier message: 05/07/2006, 11h59
  4. [POO] PHP et la gestion des classes
    Par Acti dans le forum Langage
    Réponses: 7
    Dernier message: 23/09/2005, 00h06
  5. Réponses: 4
    Dernier message: 04/07/2002, 12h31

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