текстуры — функция C ++ падает после второго вызова

Я создаю игру, используя библиотеку C ++ SDL2. У моей игры есть строка состояния в верхней части экрана, которая должна обновляться после каждого хода. Однако обновление работает только один раз. Повторное обновление вызывает сбой программы.

Я провел некоторое тестирование и обнаружил, что программа падает, когда поверхность преобразуется в текстуру с помощью SDL_CreateTextureFromSurface()

Вот функция, которую я использую.

//screen* is a pointer to an object that contains all screen information
//  such as dimensions, the renderer, the surface and the window object
void status_bar::update(int B, const char* E, screen* display){

if(B == 0){    //color is declared in status_bar object
color.r = 0;
color.g = 255;
color.b = 0;
}else{

color.r = 255;
color.g = 255;
color.b = 255;
}

SDL_Surface* temp_surf = TTF_RenderText_Solid(font, std::to_string(long double(B)).c_str(), color);
balanceRECT = temp_surf->clip_rect;
if(!balanceTEXT){

SDL_DestroyTexture(balanceTEXT);
}
balanceTEXT = SDL_CreateTextureFromSurface(display->Renderer, temp_surf); //Here the program crashes

balanceRECT.x = B_Mid_Coord.x - (balanceRECT.w / 2);
balanceRECT.y = B_Mid_Coord.y - (balanceRECT.h / 2);

SDL_FreeSurface(temp_surf);

temp_surf = TTF_RenderText_Solid(font, E, white);
energyRECT = temp_surf->clip_rect;
if(!energyTEXT){

SDL_DestroyTexture(energyTEXT);
}
energyTEXT = SDL_CreateTextureFromSurface(display->Renderer, temp_surf);

energyRECT.x = E_Mid_Coord.x - (energyRECT.w / 2);
energyRECT.y = E_Mid_Coord.y - (energyRECT.h / 2);

SDL_FreeSurface(temp_surf);
}

Я инициализировал все библиотеки SDL, так что проблем не должно быть. Средство визуализации не исчезает между обновлениями.
Временная поверхность объявляется и определяется каждое обновление, так что должно быть хорошо.

Почему эта функция вызывает сбой моей игры?

0

Решение

Я думаю, что это может быть что-то с указателями NULL. Возможно, проверьте указатель экранного объекта перед вызовом SDL_CreateTextureFromSurface.

0

Другие решения

Вы уверены, что сбой не в предыдущей строке?

if(!balanceTEXT){
SDL_DestroyTexture(balanceTEXT);
}

Кажется, вы пытаетесь уничтожить NULL указатель

0

Я нашел свою проблему. Первый раз, когда вызывается функция обновления, находится внутри конструктора класса. Этот конструктор занимает screen* объект как параметр. Я назвал параметр display, Тем не менее, сам класс имеет screen* переменная display также.
Итак, первый раз, параметр display используется, который имеет значение, но во второй раз, переменная класса display вместо этого, который я забыл определить. Я изменил параметр на DP и добавил display = DP конструктору.

0
По вопросам рекламы [email protected]