#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. Тогда вы сможете использовать спрайт несколько раз.