在SDL2中加载同一图像的多个纹理

Loading multiple textures of the same image in SDL2

本文关键字:纹理 图像 SDL2 加载      更新时间:2023-10-16

这是如何工作的?我很难找到关于使用相同加载图像的许多纹理的教程/文档。

我首先做的是使用类似Object obj("image.png");的东西,它将SDL_Texture包装在一个对象中。当调用Object的构造函数时,每次都会加载"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中所做的就是将精灵加载到精灵对象中:

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], &theWindow);
Instance* i1 = new Instance(sprites[0], &theWindow);

但是这会杀死程序。

这不是我渲染它的问题,它甚至没有得到渲染。它只是在我调用new Instace()时终止程序。

我怀疑你不能将相同的SDL_Surface加载到不同的SDL_Textures中。那么我该如何做才能使我只需要加载一个精灵一次,然后我可以一次又一次地使用相同的精灵用于不同的纹理?

我想你需要更多的咖啡:)看看你的实例构造函数。它释放SDL_Surface。当然,在那之后你就不能再使用它了。

sdl_freessurface调用应该移动到Sprite的析构函数中。这样你就可以多次使用一个精灵了。