Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在SDL2中加载同一图像的多个纹理_C++_Sdl_Sdl 2 - Fatal编程技术网

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

C++ 在SDL2中加载同一图像的多个纹理,c++,sdl,sdl-2,C++,Sdl,Sdl 2,这是怎么回事?我很难找到关于对许多纹理使用相同加载图像的教程/文档 我最初做的是使用类似于objectobj(“image.png”),它将SDL\u纹理包装到对象中。调用对象的构造函数时,每次都会加载“image.png”。显然,如果您希望多个精灵使用同一图像,这是一个糟糕的设计。它应该只需要加载一次 因此,我现在有一个Sprite类,它将SDL_纹理封装在其中,如下所示: struct Sprite { SDL_Surface* sprite = NULL; Sprite(

这是怎么回事?我很难找到关于对许多纹理使用相同加载图像的教程/文档

我最初做的是使用类似于
objectobj(“image.png”)
,它将
SDL\u纹理
包装到对象中。调用对象的构造函数时,每次都会加载“image.png”。显然,如果您希望多个精灵使用同一图像,这是一个糟糕的设计。它应该只需要加载一次

因此,我现在有一个
Sprite
类,它将
SDL_纹理
封装在其中,如下所示:

struct Sprite {
    SDL_Surface* sprite = NULL;

    Sprite(const char* filename) {
        sprite = IMG_Load(filename);
    }
};
我还有一个
实例
类,它使用
精灵
创建纹理:

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);
    }
}
那么我主要做的就是将精灵加载到精灵对象中:

vector<Sprite*> sprites;
sprites.push_back(new Sprite("image1.png"));
sprites.push_back(new Sprite("image2.png"));
sprites.push_back(new Sprite("image3.png"));
但这扼杀了这个计划

我渲染它没有问题,它甚至没有到达渲染。当我调用
new Instace()
时,它会终止程序


我怀疑您无法将相同的
SDL\u曲面
加载到不同的
SDL\u纹理
。那么,我该如何使它只需加载一次特定的精灵,然后我就可以对不同的纹理反复使用相同的精灵?

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

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

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