【问题标题】:Loading multiple textures of the same image in SDL2在 SDL2 中加载同一图像的多个纹理
【发布时间】:2014-07-07 04:02:25
【问题描述】:

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

我一开始是使用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 对象中:

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 中。那么我该如何做到这一点,以便我只需要加载某个精灵一次,然后我就可以为不同的纹理一遍又一遍地使用同一个精灵?

【问题讨论】:

    标签: c++ sdl sdl-2


    【解决方案1】:

    我认为你需要更多的咖啡 :) 看看你的 Instance 构造函数。它释放了 SDL_Surface。当然以后就不能再使用了。

    SDL_FreeSurface 调用应该移到 Sprite 的析构函数中。这样您就可以多次使用 Sprite。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-14
      • 1970-01-01
      • 2023-04-07
      • 2017-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-11
      相关资源
      最近更新 更多