获得"无效纹理"取决于我创建纹理的位置

时间:2015-10-30 15:46:26

标签: c++ sdl-2

纹理不会出现在屏幕上,而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_是一个属性。

知道是什么原因引起的吗?

1 个答案:

答案 0 :(得分:0)

您无法轻松复制包含原始指针的类。纹理是您的类的资源,您必须管理它(及其生命周期)。

buttonPlay_ = Button();

- 创建临时Button,将其复制到buttonPlay_并暂时Button被破坏,SDL_DestroyTexture(image_)被调用。这导致在image_中悬挂buttonPlay_指针。它指向被破坏的纹理。

如果可以,最简单的方法是禁止复制Button并初始化buttonPlay_一次并且不要重新分配它。但是,如果您需要Button可复制,则应该可以使用SDL_RenderCopySDL_RenderCopyEx制作一份深层副本。不过,我推荐第一个选项。

修改

如果buttonPlay_ = Button();在构造函数中,则应在成员初始化列表中初始化,避免复制构造函数调用:

SomeClass::SomeClass() :
buttonPlay_()
{
}

如果你没有声明它,你的构造函数会默认构造buttonPlay_