在SDL2中加载同一图像的多个纹理
Loading multiple textures of the same image in SDL2
这是如何工作的?我很难找到关于使用相同加载图像的许多纹理的教程/文档。
我首先做的是使用类似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的析构函数中。这样你就可以多次使用一个精灵了。
相关文章:
- 使用 CUDA 和纹理进行图像减法
- 无法将图像加载到纹理矢量 (SFML)
- 如何显示具有 opengl 纹理的灰度图像
- Cuda 从黑/白图像创建纹理对象
- 如何将硬编码图像加载到 OpenGL 纹理中
- OpenGL纹理格式,为OpenGL创建图像/纹理数据
- stb_image在加载 opengl 纹理的图像时不会垂直翻转
- 渲染纹理创建的图像不可见
- 将2D图像映射到3D纹理
- 如何在OpenGL中将两个不同的图像渲染为两个不同图元?2D纹理阵列
- C++ OpenGL 纹理,找不到图像
- 将两个图像堆栈的非电源加载到 3D 纹理 OpenGL C++
- 如何使用索引的 PNG 图像作为 SDL2/OpenGL 的纹理
- 在 OpenGL 中重新组织图像/图片数组以适应 2 种纹理大小的幂
- 球体图像纹理被阴影贴图 - OpenGL 扭曲
- Opengl 数组纹理,适用于原始数据,但不适用于图像数据
- stb图像加载库返回白色纹理
- Cocos2d-xTMX地图与游戏精灵共享纹理图像文件
- 没有纹理图像单元的Opengl纹理
- Android:如何动态改变OpenGL ES纹理图像