Проблема с SDL_DisplayFormatAlpha (C++)

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
1 779
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

IMG_Load должен автоматически обрабатывать прозрачные PNG в конце ваших заметок. Какое фактическое исключение / ошибка возникает? Ваша трассировка стека этого не показывает.

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

SDL_DisplayFormat

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

Может быть, это твоя проблема?

Другие вопросы по теме