Partage
  • Partager sur Facebook
  • Partager sur Twitter

re: probleme SDL

dans ma fonction colorerBouton(Uint8,Uint8,Uint8)

Sujet résolu
    27 juin 2007 à 11:37:11

    EDIT: MINCE C'est du C++!! :euh:



    ceci sont des defines pour les couleurs
    pour simplifier le code je ne met pas les includes.

    #ifndef RAC_COULEUR_H
     #define RAC_COULEUR_H
    //---------------------------creation automatique de couleur--------------------
    //n'oubliez pas les majuscules au début!!
    #define Bleu(rvb) 0,0,rvb
    #define Vert(rvb) 0,rvb,0
    #define Rouge(rvb) rvb,0,0
    #define Blanc(rvb) rvb,rvb,rvb //va du noir au blanc
    #define Rose(rvb) rvb,0,rvb //va du violet au rose
    #define RV(rvb)  rvb,rvb,0 //pas de couleur exacte etrange...
    #define VB(rvb) 0,rvb,rvb //un bleu
    #define RVB(r,v,b) r,v,b // le truc classique
    #endif 


    voici ma class qui servira à creer des "boutons"
    #include "SDL/SDL.h"
    #include <SDL/SDL_image.h>


    class bouton
    {public:

    void colorerEcran(Uint8 r,Uint8 v,Uint8 b);//cette fonction marche tres bien
    void definirFenetre(long largeur,long hauteur,Uint32 flags=SDL_HWSURFACE);
    //cette fonction marche tres bien
    void colorerBouton(Uint8 R,Uint8 V,Uint8 B);//**ERREUR**
    void definirPosition(long x=0,long y=0);//definit positionSurface et image

    void defCoord(long x,long y=0);//juste surface
    void defCoordImage(long x=0,long y=0);//juste image

    void boutonSurface(long largeur,long hauteur,Uint32 flags=SDL_HWSURFACE,
    int depth=0,Uint32 Rmask=0, Uint32 Gmask=0, Uint32 Bmask=0, Uint32 Amask=0);

    void boutonImage(const char *fichier);//nom de l'image
    void blitSurface();void blitImage();void blit();//non testé

    void effacerEcran();void effacer();
    //effacerEcran seulement avec la variable "principale" bref effacez pas l'ecran 2x^^

    long xMin();long xMax();//terminé non testé
    long yMin();long yMax();//terminé non testé

    long xMinImage();long xMaxImage();//terminé non testé
    long yMinImage();long yMaxImage();//terminé non testé

    void miseAjour();//terminé non testé


    private:
    Uint8 m_r,m_v,m_b;
    long m_abs, m_ord, m_x, m_y,m_xImage,m_yImage;
    SDL_Rect m_position, m_positionImage;
    SDL_Surface *m_ecran,*m_surface,*m_surfaceImage;
    bool m_Image;

    };


    ca va ce n'est que le .h ;) (il y a des fonctions inutiles :-° mais la n'est pas le probleme. :( )

    je vous passe tous le .CPP
    puis je cible l'erreur.


    //structure bouton
    void bouton::definirFenetre(long largeur,long hauteur,Uint32 flags)
    {m_ecran= SDL_SetVideoMode(largeur,hauteur, 32,flags);}

    void bouton::colorerEcran(Uint8 r,Uint8 v,Uint8 b)
    {SDL_FillRect(m_ecran, NULL, SDL_MapRGB(m_ecran->format,r,v,b));}

    void bouton::effacerEcran()
    {SDL_FreeSurface(m_ecran);}

    void bouton::effacer()
    {SDL_FreeSurface(m_surface);SDL_FreeSurface(m_surfaceImage);}

    void bouton::miseAjour()
    {SDL_Flip(m_ecran);}

    //permet de retourner dans le main l'emplacement de la surface
    long bouton::xMin(){return m_abs-1;}//retourne x minimum
    long bouton::yMin(){return m_ord-1;}//retourne y minimum
    long bouton::xMax(){return m_abs+m_x-1;}//maximum
    long bouton::yMax(){return m_ord+m_y-1;}//maximum

    long bouton::xMinImage(){return m_xImage-1;}
    long bouton::xMaxImage(){return m_surfaceImage->h-1;}
    long bouton::yMinImage(){return m_yImage-1;}
    long bouton::yMaxImage(){return m_surfaceImage->w-1;}

    //fin structure bouton
    void bouton::colorerBouton(Uint8 R,Uint8 V,Uint8 B)//**erreur**
    {m_r=R;m_v=V;m_b=B;//on stock les couleurs de la surfaces
    SDL_FillRect(m_surface, NULL, SDL_MapRGB(m_ecran->format,m_r,m_v,m_b));}
    //il existe une fonction dans racSDL/couleur.h RVB(r,v,b) à mettre dans les()

    void bouton::definirPosition(long x,long y)
    {m_position.x=x;m_position.y=y;//position de la surface
    m_positionImage.x=x;m_positionImage.y=y;//position de l'image
    m_abs=x,m_ord=y;//on stock les coordonnées de l'image
    m_xImage=x,m_yImage=y;}

    void bouton::defCoord(long x,long y)
    {m_position.x=x;m_position.y=y;
    m_abs=x;m_ord=y;}//position de la surface

    void bouton::defCoordImage(long x,long y)
    {m_positionImage.x=x,m_positionImage.y=y;
    m_xImage=x;m_yImage=y;}//position de l'image

    void bouton::boutonSurface(long largeur,long hauteur,Uint32 flags,int depth,
    Uint32 Rmask,Uint32 Gmask,Uint32 Bmask,Uint32 Amask)
    {
    m_x=largeur;m_y=hauteur;
    m_surface = SDL_CreateRGBSurface(flags,largeur,hauteur,depth,Rmask,Gmask,Bmask,Amask);
    }//seul les deux premier sont obligatoire largeur,hauteur de la surface

    void bouton::boutonImage(const char *fichier)
    {m_surfaceImage = IMG_Load(fichier);
    }//on charge l'image

    void bouton::blitSurface()//juste la surface uni
    {if(m_surface!=NULL)//securité
    SDL_BlitSurface(m_surface,NULL,m_ecran,&m_position);
    }

    void bouton::blitImage()//juste l'image
    {if(m_surfaceImage!=NULL)//securité
    SDL_BlitSurface(m_surfaceImage,NULL,m_ecran,&m_positionImage);
    }

    void bouton::blit()//blitte image et surface uni
    {if(m_surface!=NULL){
    SDL_BlitSurface(m_surface,NULL,m_ecran,&m_position);}
    if(m_surfaceImage!=NULL){
    SDL_BlitSurface(m_surfaceImage,NULL,m_ecran,&m_positionImage);}}



    voici la fonction d'ou provient l'erreur :p;)



    void bouton::colorerBouton(Uint8 R,Uint8 V,Uint8 B)//**erreur**
    {m_r=R;m_v=V;m_b=B;//on stock les couleurs de la surfaces
    SDL_FillRect(m_surface, NULL, SDL_MapRGB(m_ecran->format,m_r,m_v,m_b));}



    vous allez me dire
    que te dit le compilo???


    reponse: rien du tout meme pas un [warning]

    j'en deduis que l'erreur viens de l'utilisation de la fonction mais je vois pas l'erreur :-° )

    pouvez vous m'aider s'il vous plait :D:D:D

    s'il vous manque des informations je vous les donnent volontier ^^


    • Partager sur Facebook
    • Partager sur Twitter
      27 juin 2007 à 13:40:44

      Citation


      s'il vous manque des informations je vous les donnent volontier ^^



      Comme, quelle est ta question, par exemple ?
      Ou encore, quelle est l'erreur ? Un éléphant rose à pois jaunes apparaît sur ton écran au moment ou tu appelles la fonction ? Parceque là je peux pas tester quoi, juste lire le code, donc quand on sait pas ec qui se passe c'est plus difficile...
      • Partager sur Facebook
      • Partager sur Twitter
      J'ai déménagé sur Zeste de savoir — Ex-manager des modérateurs.
        1 juillet 2007 à 11:31:58

        mon probleme : quand je me sert de cette fonctiobn dans le main, la fenetre se ferme immediatement.

        je n'ai aucun message du compilateur
        • Partager sur Facebook
        • Partager sur Twitter
          1 juillet 2007 à 14:56:46

          Si tu n'a aucune erreur lors de la compilation lance le débogueur et dis nous ce qu'il te dis.
          C'est sûrement une erreur de segmentation ou un truc du genre ;)
          • Partager sur Facebook
          • Partager sur Twitter
            1 juillet 2007 à 18:13:43

            if (m_surface!=NULL)
            {
                SDL_FillRect(m_surface, NULL, SDL_MapRGB(m_ecran->format,m_r,m_v,m_b));
            }


            car si t'as pas encore alloué ta surface sa plante


            (on a pas ton constructeur)
            • Partager sur Facebook
            • Partager sur Twitter
              2 juillet 2007 à 12:04:49

              ma surface est alloué par:
              void bouton::boutonSurface(long largeur,long hauteur,Uint32 flags,int depth,Uint32 Rmask,Uint32 Gmask,Uint32 Bmask,Uint32 Amask)


              le déboggeur me dit erreur de segmentation
              mais je ne sais pas ce que cela signifie...
              qu'est-ce qu'une erreur de segmentation??? o_O


              je vais mettre un constructeur mais il ne me semble pas utile ici.
              • Partager sur Facebook
              • Partager sur Twitter
                2 juillet 2007 à 15:45:50

                Tu testes les retours de m_ecran et des surfaces que tu charges ?? Ca vient peut etre de la ...
                • Partager sur Facebook
                • Partager sur Twitter
                  2 juillet 2007 à 16:02:34

                  segfault -> Va voir sur wiki ^^

                  En fait, une erreur de segmentation (ou aussi segfault abrégé anglais), est une application qui a tenté d'accéder à une partie de la mémoire (donc variable, classe tout ce que tu veux) alors qu'elle n'y avait pas le droit. Donc en fait, elle fait que des conneries :D

                  • Partager sur Facebook
                  • Partager sur Twitter
                    2 juillet 2007 à 16:10:05

                    je ne comprend pas pourquois ma fonction n'ai pas autorisé à prendre de place...

                    • Partager sur Facebook
                    • Partager sur Twitter
                      2 juillet 2007 à 17:46:54

                      Alors je suis un peu fatigué là donc tu ne m'en voudra pas si je me trompe où si je dis une connerie :-°


                      void bouton::colorerBouton(Uint8 R,Uint8 V,Uint8 B)//**erreur**
                      {
                          m_r=R;
                          m_v=V;
                          m_b=B;//on stock les couleurs de la surfaces
                          SDL_FillRect(m_surface, NULL, SDL_MapRGB(m_ecran->format,m_r,m_v,m_b));
                      }
                       


                      Déjà c'est bien plus lisible ^^. Ensuite, pourquoi tu envois le format de m_ecran )à SDL_MapRGB alors que tu veux colorer m_surface ?

                      • Partager sur Facebook
                      • Partager sur Twitter
                        3 juillet 2007 à 12:51:04

                        une partie de mon erreur proviens du fait que m_ecran est private...
                        donc ne peut etre utilisé QUE par une unique variable bouton.

                        est-ce possible d'utiliser la meme sous-variable (m_ecran) pour toutes mes variables (bouton)???

                        • Partager sur Facebook
                        • Partager sur Twitter
                          3 juillet 2007 à 14:47:53

                          oui ca s'appelle un attribut statique. Il faut mettre le mot clé "static" devant ta variable.

                          ATTENTION, les variables statiques ont quand même quelques dangers. Faire attention a l'allocation de mémoire et surtout à la destruction. Une variable static existe MEME SI ON CREE AUCUN OBJET DE LA CLASSE.

                          Il y a encore d'autres subtilités concernant l'héritage de variables statiques.
                          • Partager sur Facebook
                          • Partager sur Twitter
                          Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
                            3 juillet 2007 à 18:21:54

                            merci je vais essayer ca si tout fonctionne je met ce suget en résolu ;)
                            • Partager sur Facebook
                            • Partager sur Twitter
                              6 juillet 2007 à 15:19:11

                              merci pour tout mon probleme est résolu ^^
                              • Partager sur Facebook
                              • Partager sur Twitter

                              re: probleme SDL

                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                              • Editeur
                              • Markdown