Как я уже сказал в этом вопросе , я использую SDL для небольшой игры, которую разрабатываю. Теперь у меня проблемы с SDL_DisplayFormatAlpha. Я пытаюсь создать поверхность с альфа-каналом из изображения в формате PNG. Раньше это работало, но теперь, когда я сделал небольшой рефакторинг, что-то сломалось. Я сузил это до этого конструктора:
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 );
}
Это компилируется просто отлично, но когда я запускаю его, я получаю ошибку сегментации.
Ошибка, сообщаемая 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
Трассировка стека выглядит следующим образом:
#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
Если я закомментирую surface = SDL_DisplayFormatAlpha( tempSurface );
и SDL_FreeSurface( tempSurface );
и раскомментирую surface = tempSurface;
примерно так:
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 );
}
Тогда, кажется, работает просто отлично. Кто-нибудь может сказать мне, что происходит? На самом деле, прозрачность тоже работает, когда я закомментирую SDL_DisplayFormatAlpha. Эта функция предназначена только для изображений, которые еще не имеют альфа-канала?