C++ et héritage (SDL)

C++ et héritage (SDL) - C++ - Programmation

Marsh Posté le 15-07-2003 à 12:22:02    

Salut,
 
Voilà je suis en train de faire un petit programme en SDL (librairie graphique à l'origine pour les jeux) et je me prends la tête déjà depuis un moment sur un problème de classes et d'héritage.
 
Il s'agit d'un frontend à MPlayer en quelque sorte (+ émulateurs divers) pour ma DivXBox :
 
  Ecran de démarrage :
 
    - DVD   --> Clic => Lance le DVD Video
    - Films --> Clic => Liste des films s'affichent
    - Jeux  --> Clic => Liste des ROMs s'affichent
 
Comme l'écran de démarrage et les 2 autres partagent de nombreuses données comunes (un fond d'écran en SDL_Surface* par exemple), je pensais me servir de la notion d'héritage.
 
Donc : Ecran, classe de base
       Démarrage, Films, Jeux, classes dérivées
 
Seulement je ne vois pas trop comme ça marche.
Je voudrais pouvoir créer un objet de classe Démarrage (qui lancera le constructeur de Ecran, la classe de base, pour initialiser SDL entre autre) qui, suivant ce sur quoi on clique, créera un objet de type Films ou Jeux *mais* en reprenant les données membres de la classe Ecran.
 
C'est possible donc ? Je veux donc créer des objets en gardant comme "noyau central" les données membres d'un objet de la classe de base.
 
 
Merci de m'aider !
 
A+

Reply

Marsh Posté le 15-07-2003 à 12:22:02   

Reply

Marsh Posté le 17-07-2003 à 15:48:23    

UP UP UP :)

Reply

Marsh Posté le 17-07-2003 à 17:29:03    

Citation :

C'est possible donc ? Je veux donc créer des objets en gardant comme "noyau central" les données membres d'un objet de la classe de base.


 
Ben tu les met en protected.
Je vois trop le problème. Donne un peu de code.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 17-07-2003 à 20:34:13    

Donc mon idée serait de faire :
 
int main(int argc, char *argv[])
{
    Demarrage().Start();
    return 0;
}
 
Je voudrais donc que ça lance automatiquement Ecran::Ecran(), pour initialiser tout SDL, et ensuite lancer la boucle de choix "DVD", "Films" ou "Jeux".
 
 
class Ecran
{
    public:
        Ecran();
 
        void DrawIMG(SDL_Surface *img, int x, int y);
 
 
        // les fonctions suivantes seront redéfinies dans chaque classe et sont donc virtuelles
        virtual void Start(); // fonction de "démarrage"
        virtual void DrawAll(); // va dessiner tous les élements graphiques par itération
        virtual void ProcessSelection(); // action à prendre lors de clic/ENTREE
        virtual void ProcessKey(); // action à prendre lors de mouvement clavier/joystick
 
 
        SDL_Event event;
 
        SDL_Surface *screen;
        SDL_Surface *background;
        SDL_Surface *text;
 
        SDL_Color black;
        SDL_Color white;
 
        TTF_Font *font;
};
 
class Demarrage : public Ecran
{
    public:
        Demarrage();
 
        void Start();
        void DrawAll();
        void ProcessSelection();
        void ProcessKey();
 
 // on rajoute en "private" les données supplémentaires spécifiques
        // à cette classe
    private:
 
        void DrawTopic(vector<string>::const_iterator &, int, int, bool);
 
        vector<string> topics;
        vector<string>::const_iterator currentTopic;
 
        SDL_Surface *rectangle;
};
 
class Films : public Ecran
{
    public:
        Films();
 
 
        void Start();
        void DrawAll();
        void ProcessSelection();
        void ProcessKey();
 
 // on rajoute en "private" les données supplémentaires spécifiques
        // à cette classe
    private:
 
        void DrawFile(vector<string>::const_iterator &, int, int, bool);
        void PopulateFiles();
        int VectorPosition(vector<string> &, string);
 
        vector<string> files;
        vector<string>::const_iterator currentFile;
        vector<string>::const_iterator topFile;
 
        set<string> extensions;
 
        SDL_Surface *up;
        SDL_Surface *down;
 
        SDL_Rect tick;
        SDL_Rect bar;
 
        TTF_Font *filesFont;
        TTF_Font *titleFont;
        TTF_Font *symbolFont;
};
 
Voilà donc les classes. Et maintenant, est-ce possible, dans Demarrage::ProcessSelection() par exemple, d'appeler Films::Start() et reprendre les données issues de la classe Ecran précédemment initialisées (et faire de même pour quand on reviendra "en arrière" à l'écran de démarrage).
 
J'espère que c'est pas trop confus :-)

Reply

Marsh Posté le 18-07-2003 à 14:27:26    

Visiblement, tu ne connais pas trop l'héritage, avant de continuer, trouve-toi un bouquin et lis ... Ca fait pas de mal ...
 
juste une précision : le mot-clé virtual ne te permet pas d'avoir des fonctions sans corps ... Il faut que la fonction soit déclarée virtuelle pure dans ecran, exemple :

Code :
  1. virtual void Start() =0;


 
Pour ce qui est des attributs publics de ta classe ecran, tu préfèreras sans doute les voir derrière un simple protected ... Mais j'imagine que tu ne connais pas, alors bonne lecture ... ;)


Message édité par theshockwave le 18-07-2003 à 14:28:56

---------------
last.fm
Reply

Marsh Posté le 20-07-2003 à 13:37:03    

theShOcKwAvE tu m'as coupé l'herbe sous le pied.  
Rien à redire :sol:  

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed