Question

Comme je l'ai indiqué dans cette question , J'utilise SDL pour un petit jeu que je développe. Maintenant, j'ai des problèmes avec SDL_DisplayFormatAlpha. J'essaie de créer une surface avec un canal alpha à partir d'une image PNG. Cela fonctionnait auparavant, mais maintenant que j'ai procédé à une légère refactorisation, quelque chose s'est cassé. Je l'ai réduit à ce constructeur:


Surface::Surface( tfilename file ) {
    // initialize the surface data member to the image indicated by filename
    SDL_Surface *tempSurface;
    tempSurface = IMG_Load( file.c_str() );
    if ( !tempSurface ) {
        surface = NULL;
        exit(1);
    }
    else {
        surface = SDL_DisplayFormatAlpha( tempSurface );
        //surface = tempSurface;
    }
    SDL_FreeSurface( tempSurface );
}

Cela compile parfaitement, mais lorsque je l’exécute, je reçois une erreur de segmentation. L'erreur signalée par gdb:

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0xb79c16c0 (LWP 8089)]
0xb7e8b9a3 in SDL_DisplayFormatAlpha () from /usr/lib/libSDL-1.2.so.0

La trace de la pile est la suivante:

#0  0xb7e8b9a3 in SDL_DisplayFormatAlpha () from /usr/lib/libSDL-1.2.so.0
#1  0x0804987e in Surface (this=0x804d060, file=@0xbfb20760) at Surface.cpp:16
#2  0x0804a159 in Image (this=0x804d038, x=0, y=0, file=@0xbfb207a0)
    at Image.cpp:16
#3  0x0804a3de in Object (this=0x804d028, imageFile=@0xbfb207dc)
    at Object.cpp:4
#4  0x080491cb in Application (this=0xbfb20810) at Application.cpp:8
#5  0x08048e0d in main () at main.cpp:5

Si je commente surface = SDL_DisplayFormatAlpha (tempSurface); et SDL_FreeSurface (tempSurface); et décommenter surface = tempSurface; comme suit:



Surface::Surface( tfilename file ) {
    // initialize the surface data member to the image indicated by filename
    SDL_Surface *tempSurface;
    tempSurface = IMG_Load( file.c_str() );
    if ( !tempSurface ) {
        surface = NULL;
        exit(1);
    }
    else {
        //surface = SDL_DisplayFormatAlpha( tempSurface );
        surface = tempSurface;
    }
    //SDL_FreeSurface( tempSurface );
}

Ensuite, cela semble bien fonctionner. Quelqu'un peut-il me dire ce qui se passe? En fait, la transparence semble fonctionner également lorsque je commente SDL_DisplayFormatAlpha. Cette fonction est-elle uniquement destinée à être utilisée avec des images qui ne possèdent pas déjà de canal alpha?

Était-ce utile?

La solution

IMG_Load doit gérer les PNG transparents automatiquement, à la fin de vos notes de publication. Quelle est l'exception / erreur réelle générée? Votre trace de pile ne montre pas cela.

Autres conseils

Si vous lisez le lien ici (fonction associée):

SDL_DisplayFormat

" Vous devez appeler SDL_Init avant d'utiliser la fonction SDL_DisplayFormat. Sinon, votre programme plantera avec une violation d'accès. "

Cela pourrait-il être votre problème?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top