Проблема с SDL_DisplayFormatAlpha (c ++) - PullRequest
0 голосов
/ 05 декабря 2008

Как я уже сказал в этом вопросе , я использую 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. Эта функция предназначена только для изображений, которые еще не имеют альфа-канала?

Ответы [ 2 ]

1 голос
/ 05 декабря 2008

IMG_Load должен обрабатывать прозрачные PNG автоматически, как отмечает ваш пост. Что является действительным исключением / ошибкой? Ваша трассировка стека не показывает это.

0 голосов
/ 05 декабря 2008

Если вы прочитали ссылку здесь (связанная функция):

SDL_DisplayFormat

«Вы должны вызвать SDL_Init перед использованием функции SDL_DisplayFormat. Если вы этого не сделаете, ваша программа потерпит крах с нарушением доступа.»

Может ли это быть вашей проблемой?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...