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

时间:2014-07-06 19:49:47

标签: c++ sdl sdl-2

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

我最初做的是使用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中做的是将sprite加载到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], &theWindow);
Instance* i1 = new Instance(sprites[0], &theWindow);

但这会杀死该计划。

渲染它并不是问题,它甚至无法渲染。当我拨打new Instace()时,它就会杀死该程序。

我怀疑您无法将相同的SDL_Surface加载到不同的SDL_Textures中。那么我该如何制作它以便我只需要加载某个精灵一次然后我可以反复使用相同的精灵来制作不同的纹理?

1 个答案:

答案 0 :(得分:1)

我认为你需要更多咖啡:)看看你的Instance构造函数。它释放了SDL_Surface。当然,之后你就无法重复使用它。

应该将SDL_FreeSurface调用移动到Sprite的析构函数中。然后,您将能够多次使用Sprite。