纹理不会出现在屏幕上,而SDL_RenderCopy
会返回错误代码"无效纹理"。但是,只有在构造函数中加载曲面时才会发生这种情况,而不是在Init
函数中。
如果我不用以下方法破坏纹理,也不会发生:
SDL_DestroyTexture(image_);
我使用它来加载图像(没有做这部分代码):
SDL_Texture* ImageFunc::LoadSprites(const char* filename,bool alpha,int r, int g, int b)
{
SDL_Surface* old_image=NULL;
SDL_Texture* new_image=NULL;
old_image=SDL_LoadBMP(filename);
if(!old_image)
printf("image loadinf failure: image func: SDL_LoadBMP \n");
if(alpha)
SDL_SetColorKey( old_image, SDL_TRUE, SDL_MapRGB( old_image->format,r, g,b ) );
new_image=SDL_CreateTextureFromSurface(Global::renderer,old_image);
if(!new_image)
printf("image loading failure: image_func\n");
SDL_FreeSurface(old_image);
return new_image;
}
(ImageFunc是命名空间)
所以这不起作用:
void Button::Init()
{
}
Button::Button()
{
position_.x = 0;
position_.y = 0;
position_.w = 200;
position_.h = 100;
image_ = ImageFunc::LoadSprites("Images/ButtonPlay.bmp");
}
但是,如果我在Init方法中加载LoadSprite,它就会工作。
构造函数和init方法在完全相同的时间调用:
buttonPlay_ = Button();
buttonPlay_.Init();
值得注意的是,它在构造函数中并且buttonPlay_是一个属性。
知道是什么原因引起的吗?
答案 0 :(得分:0)
您无法轻松复制包含原始指针的类。纹理是您的类的资源,您必须管理它(及其生命周期)。
buttonPlay_ = Button();
- 创建临时Button
,将其复制到buttonPlay_
并暂时Button
被破坏,SDL_DestroyTexture(image_)
被调用。这导致在image_
中悬挂buttonPlay_
指针。它指向被破坏的纹理。
如果可以,最简单的方法是禁止复制Button
并初始化buttonPlay_
一次并且不要重新分配它。但是,如果您需要Button
可复制,则应该可以使用SDL_RenderCopy
或SDL_RenderCopyEx
制作一份深层副本。不过,我推荐第一个选项。
修改强>
如果buttonPlay_ = Button();
在构造函数中,则应在成员初始化列表中初始化,避免复制构造函数调用:
SomeClass::SomeClass() :
buttonPlay_()
{
}
如果你没有声明它,你的构造函数会默认构造buttonPlay_
。