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

SDL Discussion :

Problème POO C++ et SDL


Sujet :

SDL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2002
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 43
    Points : 36
    Points
    36
    Par défaut Problème POO C++ et SDL
    Bonjour, ou bonsoir!

    J'ai suivit les tutoriels concernant la SDL sur le site, celui en plusieurs parties. Ils sont très bien construit et m'ont grandement aidé à comprendre le fonctionnement de SDL.

    Cependant, en lisant régulièrement des post ici je me suis rendu compte qu'il était plus qu'important de modularisé son moteur. Donc j'ai créer 3 classes.

    La première se trouve à être le Moteur, dans cette glasses, les états du moteurs sont définit, de plus les méthodes d'initialisations sont inclut dans cette classes.

    La deuxieme classes se trouve à être une classe qui gère le peu de 2d qui se fait présentement, en gros elle charge une image de fond à mon application.

    La troisième est ma classe qui créer une instance de Moteur.

    Donc mon problème est le suivant, dans la classe Application, ma troisième, j'instancie un Moteur et un outil2D, j'initialise mon Moteur et je donne a mon moteur sa première surface de base , quie st une surface Video, par l'entremise de la classe Applciation. Le problème vient lorsque j'essaie de charger une image dans mon Moteur, le chargement de cette dernière s'exécute cependant l'affichage ne se fait pas...

    Quelqu'un aurait une idée, je vous donne ma facon de procèdé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    engin.setScreen(SDL_SetVideoMode( 640, 480, 16, SDL_HWSURFACE ));
    SDL_WM_SetCaption( "Utopia Engine ", NULL);
    outil2D.changeBackground("Screen_Loading_First.png", engin.getScreen());
    Merci de l'Attention que vous y porterez.

  2. #2
    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 Marneus
    J'ai suivit les tutoriels concernant la SDL sur le site, celui en plusieurs parties. Ils sont très bien construit et m'ont grandement aidé à comprendre le fonctionnement de SDL.
    Au nom de l'équipe,

    Cependant, en lisant régulièrement des post ici je me suis rendu compte qu'il était plus qu'important de modularisé son moteur. Donc j'ai créer 3 classes.
    Modularisé, c'est !

    La première se trouve à être le Moteur, dans cette glasses, les états du moteurs sont définit, de plus les méthodes d'initialisations sont inclut dans cette classes.
    C'est un facon de faire les choses... Personnellement, la classe moteur est plus le chef d'orchestre que juste une classe d'initialisation mais bon, tu n'en dis pas assez pour qu'on se fasse une bonne idée...

    La deuxieme classes se trouve à être une classe qui gère le peu de 2d qui se fait présentement, en gros elle charge une image de fond à mon application.
    Ok, pourquoi pas...

    La troisième est ma classe qui créer une instance de Moteur.

    Donc mon problème est le suivant, dans la classe Application, ma troisième, j'instancie un Moteur et un outil2D, j'initialise mon Moteur et je donne a mon moteur sa première surface de base , quie st une surface Video, par l'entremise de la classe Applciation.
    Donc t'as une classe qui contient ton moteur... C'est aussi possible, cela permettrait au programme général de changer de moteur facilement...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    engin.setScreen(SDL_SetVideoMode( 640, 480, 16, SDL_HWSURFACE ));
    SDL_WM_SetCaption( "Utopia Engine ", NULL);
    outil2D.changeBackground("Screen_Loading_First.png", engin.getScreen());
    Ce bout de code ne suffit pas pour se faire une idée du problème. Il faudrait voir :

    - La boucle événementielle
    - Le code d'affichage
    - La facon dont le moteur appelle ce code
    - La fonction changeBackground

    Jc

  3. #3
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    engin.setScreen(SDL_SetVideoMode( 640, 480, 16, SDL_HWSURFACE ));
    Si tu veux créer un bon module, il faudrait que l'implémentation dépende de SDL mais que l'utilisateur ne sache pas (à travers les méthodes qu'il utilise) que tu utilises SDL (enfin, c'est un avis).

    Tu devrais directement donner les paramètres 640, 480 et 16 en paramètres (SDL_HWSURFACE est en général toujours fait)) et que la méthode setScreen appelle SDL_SetVideoMode, ainsi, l'utilisateur ne verrait pas que ton moteur dépend de SDL.

    Enfin, je sais, je ne répond pas à la question, mais c'est un point à exploiter niveau modularité.
    Je ne répondrai à aucune question technique en privé

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2002
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 43
    Points : 36
    Points
    36
    Par défaut
    Citation Envoyé par fearyourself
    C'est un facon de faire les choses... Personnellement, la classe moteur est plus le chef d'orchestre que juste une classe d'initialisation mais bon, tu n'en dis pas assez pour qu'on se fasse une bonne idée...
    Après avoir envoyé mon message ici, c'est exactement ce que je me suis dit. Pour le blitting de surface et ainsi de suite je vais donner cette responsabilité à ma classe Moteur, de son côté ma classe Menu2D, elle, me chargeras mes surfaces et me permetteras de les passé au moteurs.

    Citation Envoyé par millie
    Si tu veux créer un bon module, il faudrait que l'implémentation dépende de SDL mais que l'utilisateur ne sache pas (à travers les méthodes qu'il utilise) que tu utilises SDL (enfin, c'est un avis).
    Merci je prends note de cette recommendation.

    Donc je vais revoir mon code d'ici la fin de semaine, question de changé mes responsabilité de place et revoir le tout et je redonnes des nouvelles!

    Merci encore!

  5. #5
    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 Marneus
    Après avoir envoyé mon message ici, c'est exactement ce que je me suis dit. Pour le blitting de surface et ainsi de suite je vais donner cette responsabilité à ma classe Moteur, de son côté ma classe Menu2D, elle, me chargeras mes surfaces et me permetteras de les passé au moteurs.
    Personnellement, je laisserais le moteur appeller une instance de Menu2D pour :

    - L'initialisation
    - Le rendu
    - La fermeture

    Le travail du moteur est d'appeler les bonnes fonctions au bon moment pas de s'occuper des détails du rendu... (ou alors de facon très générique pour pouvoir s'appeler moteur)

    Jc

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2002
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 43
    Points : 36
    Points
    36
    Par défaut
    Citation Envoyé par millie
    Si tu veux créer un bon module, il faudrait que l'implémentation dépende de SDL mais que l'utilisateur ne sache pas (à travers les méthodes qu'il utilise) que tu utilises SDL (enfin, c'est un avis).

    Tu devrais directement donner les paramètres 640, 480 et 16 en paramètres (SDL_HWSURFACE est en général toujours fait)) et que la méthode setScreen appelle SDL_SetVideoMode, ainsi, l'utilisateur ne verrait pas que ton moteur dépend de SDL.
    Voilà j'ai finalement eu le temps de bossé sur mon engin. J'ai tenté de mettre en application vos suggestion. Cependant je crois que mon peu d'expérience avec les pointeurs me nuit en ce moment. Je vous explique.

    Ma classe Moteur est doté d'une fonction initScreen qui elle créer le device est supposé me l'afficher. Cependant puisqu'elle cette initialisation ne se produit pas dans ma classe principal et bien elle n'affiche tout simplement pas mon device. Pareil lorsque je veux afficher des images dans ce device, si ce dernier est créer dans ma classe principal.

    Je vous postes quelques lignes de code pour vous montré la séquence d'appel.

    Totu d'Abord dans ma classe Application, celle qui démarre le moteur. Elle est doté d'un main. Je vous donne les lignes importante.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Moteur engin; // On instancie le moteur
    ...
    if(!engin.init())
    	{
    		printf( "Can't init SDL : %s\n", SDL_GetError() );
    		return EXIT_FAILURE;
    	}
     
    engin.screenInit();
    ....
    engin.changeBackground("Screen_Loading_First.png");
    Maintenant la classe Moteur qui elle se chargeras, car ce n'est pas encore parfait, de gèré l'apelle des méthode nécessaire.

    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
     
    Menu2D outil2D; // On déclare le gestionnaire de la 2D
    ....
    void screenInit()
    {
    setScreen(SDL_SetVideoMode( 640, 480, 16, SDL_HWSURFACE ));
    SDL_WM_SetCaption( "Utopia Engine ", NULL);
    }
    ....
    void changeBackground(std::string filename)
    {
    	screen_loading = outil2D.load_image(filename.c_str());
    	if(screen_loading == NULL)
    	{
    	printf( "Can't init SDL : %s\n", SDL_GetError() );
    	}
     
    	if(screen == NULL)
    	{
    	printf( "Can't init SDL : %s\n", SDL_GetError() );
    	}
     
    	apply_surface( 100,100, screen_loading, screen );
     
    	if( SDL_Flip( screen ) == -1 )
        {
            printf( "Can't init SDL : %s\n", SDL_GetError() );
     
        }
    }
    ...
    void apply_surface( int x, int y, SDL_Surface* source, SDL_Surface* destination )
    {
    	SDL_Rect offset;
     
    	offset.x = x;
    	offset.y = y;
     
    	// On blitte la surface
    	SDL_BlitSurface( source, NULL, destination, &offset );
    }
    Pour finir je vous montre ma méthode load_files de ma classe Menu2D

    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
     
    SDL_Surface *load_image( std::string filename ) {
     
    	//Surface tampon qui nous servira pour charger l'image
    	SDL_Surface* loadedImage = NULL;
     
    	//L'image optimisée qu'on va utiliser
    	SDL_Surface* optimizedImage = NULL;
     
    	// Chargement de l'image
    	loadedImage = IMG_Load( filename.c_str() );
     
    	//Si le chargement se passe bien
    	if( loadedImage != NULL)
    	{
    		//Création de l'image optimisée
    		optimizedImage = SDL_DisplayFormat( loadedImage );
     
    		//Libération de l'ancienne image
    		SDL_FreeSurface( loadedImage );
    	}
     
    	// On retourne l'image optimisée
    	return optimizedImage;
     
    }
    Comme vous pourrez le constatez, certaines fonctions proviennent d'ici et ont été modifié.

    Je crois que mon principal problème est dû à la gestion des pointeurs. Je suis présentement après lire un tutoriel ici même concernant les pointeurs.

    Alors qu'en pensez vous?

  7. #7
    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 Marneus
    Ma classe Moteur est doté d'une fonction initScreen qui elle créer le device est supposé me l'afficher. Cependant puisqu'elle cette initialisation ne se produit pas dans ma classe principal et bien elle n'affiche tout simplement pas mon device. Pareil lorsque je veux afficher des images dans ce device, si ce dernier est créer dans ma classe principal.
    Je ne sais pas ce que tu appelles ton device donc c'est difficile de comprendre le problème.

    Totu d'Abord dans ma classe Application, celle qui démarre le moteur. Elle est doté d'un main. Je vous donne les lignes importante.
    Un main dans une classe ? Tu veux sûrement dire que c'est là que se trouve le main du programme... Pourquoi ne pas le séparé du code de la classe ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Moteur engin; // On instancie le moteur
    ...
    if(!engin.init())
    	{
    		printf( "Can't init SDL : %s\n", SDL_GetError() );
    		return EXIT_FAILURE;
    	}
     
    engin.screenInit();
    ....
    engin.changeBackground("Screen_Loading_First.png");
    A ce niveau rien de spécial à dire, j'aimerais voir tout le main pour pouvoir en dire plus...

    Maintenant la classe Moteur qui elle se chargeras, car ce n'est pas encore parfait, de gèré l'apelle des méthode nécessaire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Menu2D outil2D; // On déclare le gestionnaire de la 2D
    Beurk, une déclaration globale ?

    [code]
    void changeBackground(std::string filename)
    {
    screen_loading = outil2D.load_image(filename.c_str());
    if(screen_loading == NULL)
    {
    printf( "Can't init SDL : %s\n", SDL_GetError() );
    }

    if(screen == NULL)
    {
    printf( "Can't init SDL : %s\n", SDL_GetError() );
    }

    apply_surface( 100,100, screen_loading, screen );

    if( SDL_Flip( screen ) == -1 )
    {
    printf( "Can't init SDL : %s\n", SDL_GetError() );

    }
    }
    Non! on affiche tout dans une fonction qui est appelé à partir de la boucle événementielle. On ne fait un seul flip par itération de cette boucle... Voir n'importe quel tutoriel de SDL pour voir comment faire...

    Pour finir je vous montre ma méthode load_files de ma classe Menu2D

    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
     
    SDL_Surface *load_image( std::string filename ) {
     
    	//Surface tampon qui nous servira pour charger l'image
    	SDL_Surface* loadedImage = NULL;
     
    	//L'image optimisée qu'on va utiliser
    	SDL_Surface* optimizedImage = NULL;
     
    	// Chargement de l'image
    	loadedImage = IMG_Load( filename.c_str() );
     
    	//Si le chargement se passe bien
    	if( loadedImage != NULL)
    	{
    		//Création de l'image optimisée
    		optimizedImage = SDL_DisplayFormat( loadedImage );
     
    		//Libération de l'ancienne image
    		SDL_FreeSurface( loadedImage );
    	}
     
    	// On retourne l'image optimisée
    	return optimizedImage;
    }
    Rien à dire, c'est bon ça.

    Je crois que mon principal problème est dû à la gestion des pointeurs. Je suis présentement après lire un tutoriel ici même concernant les pointeurs.

    Alors qu'en pensez vous?
    Sans un code minimal compilable (avec l'image pour le fond) qui expose clairement le problème et nous permet de voir le problème et comprendre un peu mieux

    Jc

  8. #8
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    void screenInit()
    {
    setScreen(SDL_SetVideoMode( 640, 480, 16, SDL_HWSURFACE ));
    SDL_WM_SetCaption( "Utopia Engine ", NULL);
    }
    En fait, ce que je suggèrais (enfin, ça marche aussi), c'était avec un prototype du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void screenInit(unsigned int tailleX, unsigned int tailleY);
    (avec éventuellement le nom de la fenetre).

    Mais bon, ce n'est qu'un détail. En tout cas, c'est bien parce que les prototypes de tes fonctions ne dépendent plus de SDL



    Juste une question, dans

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void changeBackground(std::string filename)
    {
    	screen_loading = outil2D.load_image(filename.c_str());
    J'ai l'impression que tu ne détruis pas l'ancienne image de fond. C'est à dire que si tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    machin.changeBackground("monfichier.bmp");
    puis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    machin.changeBackground("monfichier2.bmp");
    La place n'est pas liberée.

    Mais c'est un peu le "bordel" dans le code que tu présentes, tu devrais poster tes classes (même juste les champs public).

    Car tu déclares changeBackground comme une fonction alors que c'est une méthode, et jm'emmèle un peu. Je ne sais plus quoi s'applique à quoi.
    Je ne répondrai à aucune question technique en privé

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2002
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 43
    Points : 36
    Points
    36
    Par défaut
    Ok, je vous remercie de vos recommendations.

    J'ai apporté plusieurs modifications à mon code. J'ai suivit les conseil de milie pour que l'utilisation du "framework" ne montre pas que nous utilisons la librairie SDL.

    De plus, ma fonction pour fliper mon image est maintenant appeler une fois par itération de ma boucle principal.

    Ce que j'entends par device est tout simplement la fenêtre de l'application.

    J'ai d'ailleurs un problème a faire afficher cette écran lorsque je fait la déclaration de celle ci comme milie me l'a mentionner. C'est a dire dans une autre classe. Bref je continue a bosser sur mon problème et je vous reviens si j'ai de plus amples question.

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2002
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 43
    Points : 36
    Points
    36
    Par défaut
    J'ai résolu une grosse partie de mon problème, je faisait mon main dans uen classe a part de l'initialisation. Maintenant que mon initialisation de ma fenêtre est dans la même classe tout fonctionne comme ilf aut!

    Merci encore du coup de pouce!

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

Discussions similaires

  1. [PHP 5.3] Problème POO avec class Stylo {
    Par éric1 dans le forum Langage
    Réponses: 2
    Dernier message: 27/07/2009, 18h42
  2. Problème de compilation gcc & SDL sous Mac OS X
    Par geogeoint dans le forum Apple
    Réponses: 1
    Dernier message: 06/05/2009, 14h05
  3. Problème de compilation avec sdl en c++
    Par Jean_guy dans le forum SDL
    Réponses: 6
    Dernier message: 05/02/2008, 15h51
  4. Problème avec mon pot SDL
    Par darkwall_37 dans le forum Windows
    Réponses: 0
    Dernier message: 02/02/2008, 21h30
  5. Réponses: 2
    Dernier message: 03/11/2007, 09h28

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