Загрузка нескольких текстур одного и того же изображения в SDL2

#c #sdl #sdl-2

#c #sdl #sdl-2

Вопрос:

Как это работает? У меня возникли проблемы с поиском руководств / документации по использованию одного и того же загруженного изображения для многих текстур.

Сначала я использовал что-то вроде Object obj("image.png"); , которое обертывает SDL_Texture в объект. При вызове конструктора объекта он каждый раз загружает «image.png». Очевидно, что это плохой дизайн, если вы хотите, чтобы несколько спрайтов использовали одно и то же изображение. Его нужно загрузить только один раз.

Итак, что у меня есть сейчас, это Sprite класс, который заключает SDL_Texture в себя, вот так:

 struct Sprite {
    SDL_Surface* sprite = NULL;

    Sprite(const char* filename) {
        sprite = IMG_Load(filename);
    }
};
  

И у меня также есть Instance класс, который использует Sprite для создания текстур:

 struct Instance {
    Sprite* sprite = NULL;
    SDL_Texture* texture = NULL;

    Instance(Sprite* spr, WindowWrapper* wr) {
        texture = SDL_CreateTextureFromSurface(wr->renderer, sprite->sprite);
        SDL_FreeSurface(sprite->sprite);
    }
}
  

Итак, то, что я делаю в main, — это загружаю спрайты в объекты Sprite:

 vector<Sprite*> sprites;
sprites.push_back(new Sprite("image1.png"));
sprites.push_back(new Sprite("image2.png"));
sprites.push_back(new Sprite("image3.png"));
  

…а затем загрузите их в Instance объекты.

 Instance* i0 = new Instance(sprites[0], amp;theWindow);
Instance* i1 = new Instance(sprites[0], amp;theWindow);
  

Но это убивает программу.

У меня нет проблем с его рендерингом, он даже не доходит до рендеринга. Это просто убивает программу при моем вызове new Instace() .

Я подозреваю, что вы не можете загрузить одно и то же SDL_Surface в разные SDL_Textures форматы. Итак, тогда как мне сделать так, чтобы мне нужно было загружать определенный спрайт только один раз, а затем я мог использовать этот же спрайт снова и снова для разных текстур?

Ответ №1:

Я думаю, тебе нужно еще немного кофе 🙂 Посмотрите на ваш конструктор экземпляра. Это освобождает SDL_Surface. Конечно, вы не сможете повторно использовать его после этого.

Вызов SDL_FreeSurface следует переместить в деструктор Sprite. Тогда вы сможете использовать спрайт несколько раз.