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 :

Dialogue entre les classes


Sujet :

Développement 2D, 3D et Jeux

  1. #1
    Membre régulier

    Profil pro
    Inscrit en
    Août 2006
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 213
    Points : 103
    Points
    103
    Par défaut Dialogue entre les classes
    Bonjour,

    Débutant en POO, j'ai encore pas mal de soucis sur la façon de hierarchiser les différentes classes de mon jeu.

    Mon problème cette fois, est de connaitre la facon dont pourrait remonter les informations d'une sous classe à sa classe.

    Je m'explique, j'ai une premiere classe editor que voici :

    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
     
    class cEditor
    {
    	private :
    		cLevel* Level;		//Classe pour gérer le niveau
    		cInterface* Interface;	//Classe pour gérer l'interface
    		cCamera* Camera;	//Classe pour gérer la camera
    		bool Initialized;	//Pour savoir si l'éditeur a déja été initialisé
     
    	public :
    		cEditor();			//Constructeur
    		~cEditor();			//Destructeur
    		bool InitEditor();		//Initialise une partie
    		void DrawEditor();	//Appelle les méthode Draw de level et interface
    		void UpdateEditor();	//MaJ de l'interface et des tiles
    		void UpdateEvents(SDL_Event &event);//Gestion des événements (clavier, ...)
     
    };
    Cette classe contient une sous-classe Interface qui est en fait une gui pour gérer les boutons et autres widgets. Le problème, c'est que je veux que si je click sur l'un des boutons de la classe Interface, cela me modifie la position de la camera. Or cette camera est gérée dans la classe Editor. J'aimerai donc savoir comment remonter la demande de changement de position à la classe Editor.

  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 : 39
    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
    En général on connecte des évènements de l'interface à des fonctions quelconques par un mécanisme de signaux / slots. Ainsi on peut brancher n'importe quelle fonction de n'importe quelle objet sur un évènement quelconque de l'interface, sans que celle-ci ait à en connaître l'existence.

    Maintenant faut voir comment tes classes de GUI gèrent ça. Si c'est toi qui les développe je te conseille de te pencher sur boost.signal, ou au moins sur boost.function

  3. #3
    Membre régulier

    Profil pro
    Inscrit en
    Août 2006
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 213
    Points : 103
    Points
    103
    Par défaut
    La gui utilisée est Guichan.

    Voici la classe :
    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
     
    class cInterface : public gcn::ActionListener
    {
    	private :
    		gcn::SDLInput* Input;						//Driver des entrées (Clavier,...)
    		gcn::OpenGLGraphics* Graphics;				//Driver Graphique
    		gcn::OpenGLSDLImageLoader* ImageLoader;		//Loader d'image
    		gcn::Gui* Gui;								//Gui
    		gcn::ImageFont* Font;						//Le font ou text
    		gcn::Container* Container;					//Conteneur principal
    		gcn::Window *Window_Menu;					//Fenêtre principale : menu
    		gcn::Window *Window_Messages;				//Fenêtre secondaire : messages
    		gcn::Label* Label_Category;					//Label "Catégories"
    		gcn::Label* Label_Objects;					//Label "Objets"
    		gcn::Label* Label_Level;					//Label "Niveau"
    		gcn::Label* Label_Move;						//Label "Déplacement"
    		gcn::Label* Label_Zoom;						//Label "Zoom"
    		gcn::Button* Button_New;					//Bouton nouveau
    		gcn::Button* Button_Load;					//Bouton charger
    		gcn::Button* Button_Save;					//Bouton sauver
    		gcn::Button* Button_Quit;					//Bouton quitter
    		gcn::Button* Button_Put;					//Bouton insérer l'objet
    		gcn::Button* Button_Rotate;					//Bouton faire pivoter
    		gcn::Button* Button_Edit;					//Bouton éditer les paramètres de l'objet
    		gcn::Button* Button_Parameters;				//Bouton paramètres du niveau
    		gcn::Button* Button_Test;					//Bouton tester le niveau
    		gcn::Button* Button_Up;						//Bouton se déplacer vers le haut
    		gcn::Button* Button_Down;					//Bouton se déplacer vers le bas
    		gcn::Button* Button_Left;					//Bouton se déplacer vers la gauche
    		gcn::Button* Button_Right;					//Bouton se déplacer vers la droite
    		gcn::Button* Button_Textures;				//Bouton choisir les textures du niveau
    		gcn::Button* Button_Select;					//Bouton sélectionner un objet sur la map
    		gcn::Slider* Slider_Zoom;					//Slider pour le zoom
    		gcn::Icon*	Icon;							//Icone(image) de l'objet sélectionné
    		gcn::Image*	Image;							//Image pour l'icone
    		gcn::ListBox* ListBox;						//Liste classique
    		gcn::DropDown* DropDown_Category;			//Liste déroulante : catégories d'objets
    		gcn::DropDown* DropDown_Objects;			//Liste déroulante : Objets
    		cListModel_Category ListModel_Category;		//Données de la liste catégorie : catégories d'objets
    		cListModel_Road ListModel_Road;				//Données de la liste objets : route
    		cListModel_Obstacles ListModel_Obstacles;	//Données de la liste objets : obstacles
    		cListModel_Items ListModel_Items;			//Données de la liste objets : items
     
    	public :
    		cInterface();										//Constructeur
    		~cInterface();										//Destructeur
    		bool LoadInterface();								//Créé l'interface
    		void DrawInterface();								//Dessine l'interface
    		void UpdateEvents(SDL_Event event);					//Gère les événements
    		void action(const gcn::ActionEvent& actionEvent);	//Fonction appellée si action
    };
    Ensuite il faut lier un bouton créer en lui donnant un id, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Slider_Zoom->setActionEventId("Zoom");
    Slider_Zoom->addActionListener(this);
    Et les evenements sont automatiquements retournés vers action(...) :

    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
     
    void cInterface::action(const gcn::ActionEvent& actionEvent)
    {
    	//Si déplacement du slider : Zoom
    	if (actionEvent.getId() == "Zoom")
    	{
    		double Zoom_Value;
    		Zoom_Value = Slider_Zoom->getValue();
    		glMatrixMode(GL_MODELVIEW);
    		glLoadIdentity();
    		glTranslatef(0.0, 10.5, 0.0);
    		glScaled(Zoom_Value,Zoom_Value,Zoom_Value);
    	}
     
    	//Si click sur le bouton : déplacement haut
    	else if (actionEvent.getId() == "Up")
    	{
    		glMatrixMode(GL_MODELVIEW);
    		//glLoadIdentity();
    		glTranslatef(0.0, 10.5, 0.0);
    	}
    }
    Mais la, la fonction appellée à chaque événement de la gui est forcément action(...) et je ne vois pas trop comment remonter l'info.

  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 : 39
    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
    Dans ce cas il faut que tu branches ton interface (addActionListener) sur une autre classe, qui sera capable de modifier la caméra.

  5. #5
    Membre régulier

    Profil pro
    Inscrit en
    Août 2006
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 213
    Points : 103
    Points
    103
    Par défaut
    Oui mais c'est justement la dessus ou je peche. Comment lier les actions à la classe Editor qui gere la caméra, a partir d'une de ses sous-classes : Interface ?

    A moins que je ne me trompe, la classe enfant n'a pas d'accés sur la classe parent.

  6. #6
    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 : 39
    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
    Typiquement il te faut une classe intérmédiaire, qui connaîtrait à la fois l'interface et la caméra et qui ferait le lien entre elles.

    Après, quant à savoir quelle doit être cette classe et où la placer dans la hiérarchie, c'est assez délicat à dire, ça dépend de ton application

  7. #7
    Membre régulier

    Profil pro
    Inscrit en
    Août 2006
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 213
    Points : 103
    Points
    103
    Par défaut
    La solution que je pense obter, c'est de créer une fonction ReturnAction() dans la classe Interface qui renverra actionEvent.getId() à la classe Editor, juste dans les cas nécessaires comme pour le mouvement de la caméra.

    Merci de me confirmer si c'est une bonne solution.

  8. #8
    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 : 39
    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
    Pourquoi en pas faire de la classe Editor un listener de l'interface directement ? Et c'est lui qui filtrerait les évènements, ce qui me semblerait plus logique car la classe Interface n'est pas censée savoir quel évènement est utile ou non à l'extérieur de l'interface.

  9. #9
    Membre régulier

    Profil pro
    Inscrit en
    Août 2006
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 213
    Points : 103
    Points
    103
    Par défaut
    Oui c'est vrai que sa parait plus logique. J'ai moi meme essayé, mais j'avoue ne pas avoir réussi à créer un listener autrepart que dans "this", et donc dans la classe Interface ( les connaissances me manquent ).

    A la limite, je pense renvoyer actionEvent.getId() à la classe Editor, qui va appeller telle ou telle fonction de telle ou telle classe. Est-ce que comme ça sa te parait plus judicieux?

  10. #10
    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 : 39
    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
    Oui c'est vrai que sa parait plus logique. J'ai moi meme essayé, mais j'avoue ne pas avoir réussi à créer un listener autrepart que dans "this", et donc dans la classe Interface ( les connaissances me manquent ).
    Dans ce cas il faudrait créer une petite fonction supplémentaire de ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void cInterface::AddActionListener(gcn::ActionListener* Listener)
    {
        Gui->addActionListener(Listener);
    }
    Puis dans la classe cEditor, juste après la création de l'interface :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Interface->AddActionListener(this);
    Enfin si j'ai bien compris.

    A la limite, je pense renvoyer actionEvent.getId() à la classe Editor, qui va appeller telle ou telle fonction de telle ou telle classe. Est-ce que comme ça sa te parait plus judicieux?
    Disons que si tu arrives à le faire comme expliqué au-dessus, ce sera plus propre. Et puis ça évitera que la classe Interface ait à connaître la classe Editor.

  11. #11
    Membre régulier

    Profil pro
    Inscrit en
    Août 2006
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 213
    Points : 103
    Points
    103
    Par défaut
    Malheureusement, ce n'est pas si simple. AddActionListener ne s'applique qu'aux widgets créés, et étants privés à Interface je ne peux pas le faire a partir de Editor.

    Disons que si tu arrives à le faire comme expliqué au-dessus, ce sera plus propre. Et puis ça évitera que la classe Interface ait à connaître la classe Editor.
    Interface n'a pas besoin de connaitre Editor, puisque c'est editor qui appelle la fonction ReturnAction() de la classe Interface.

    Je crois que je vais rester comme ça, c'est pas le plus propre mais ça a le mérite de très bien marcher, je considere donc ce topic comme résolu.

    Merci infiniment pour ton aide et ta patiente.

  12. #12
    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 : 39
    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
    Malheureusement, ce n'est pas si simple. AddActionListener ne s'applique qu'aux widgets créés, et étants privés à Interface je ne peux pas le faire a partir de Editor.
    En fait c'est pour cela que je te proposais de créer une fonction intérmédiaire dans cInterface, qui délègue à ses widgets privés.

    Interface n'a pas besoin de connaitre Editor, puisque c'est editor qui appelle la fonction ReturnAction() de la classe Interface.

    Je crois que je vais rester comme ça, c'est pas le plus propre mais ça a le mérite de très bien marcher, je considere donc ce topic comme résolu
    Ok, c'est une solution assez propre aussi

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. conflit entre les classe java.sql.* et java.util.*;
    Par obydissonn dans le forum Langage
    Réponses: 4
    Dernier message: 26/05/2006, 18h00
  2. Réponses: 2
    Dernier message: 13/03/2006, 17h25
  3. [PHP5][MYSQL]Préserver une connexion entre les classes
    Par nesbla dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 02/02/2006, 11h51
  4. Réponses: 3
    Dernier message: 22/11/2005, 11h12
  5. Comparaison entre les classes et les fonctions
    Par Ashgenesis dans le forum Langages de programmation
    Réponses: 6
    Dernier message: 08/09/2005, 19h09

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