2016-03-12 47 views
-1

我想围绕一些SDL2类编写一个C++包装类。SDL2包装类抱怨`无效的渲染器'

现在我有这方面的工作代码,它显示一个红色的屏幕5秒钟(你可以看到,我的包装类的命名空间sdl2cc):

int main(void) 
{ 
    if (SDL_Init(SDL_INIT_VIDEO) < 0) return 1; 

    sdl2cc::Window window{"SDL_RenderClear"s, sdl2cc::Rect{sdl2cc::Point{SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED}, sdl2cc::Dimension{512, 512}}, {}}; 
    sdl2cc::Renderer renderer{window, {}}; 

    renderer.draw_color(sdl2cc::Color{sdl2cc::RGB{255,0,0}, sdl2cc::Alpha{255}}); 

    SDL_RenderClear(renderer.data()); 
    // renderer.clear(); 

    SDL_RenderPresent(renderer.data()); 
    // renderer.present(); 

    SDL_Delay(5000); 
    SDL_Quit(); 
} 

在包装类的SDL2的SDL_Renderer我有一个std::unique_ptr数据成员renderer_指向一个实际的SDL_Renderer

renderer.data()公开此指针(return this->renderer_.get();)。

我想让成员函数renderer.clear()renderer.present()正常工作。可悲的是,也没有。这是他们如何看:

void sdl2cc::Renderer::clear(void) 
{ 
    if (SDL_RenderClear(this->data()) < 0) 
    { 
     std::cerr << "Couldn't clear rendering target with drawing color:" << ' ' << SDL_GetError() << '\n'; 
    } 
} 

void sdl2cc::Renderer::present(void) 
{ 
    SDL_RenderPresent(this->data()); 
} 

如果我只是用renderer.clear(),它将打印我的错误信息+ 无效渲染

如果我只是使用renderer.present(),它会显示黑屏。

有什么不对?

为什么我自己的函数和SDL函数不相等?


的问题似乎在于在函数调用:

SDL_RenderClear(renderer.data()); // works 

// somewhere else: 
void sdl2cc::Renderer::clear(SDL_Renderer* r) 
{ 
    if (SDL_RenderClear(r) < 0) 
    { 
     std::cerr << "Couldn't clear rendering target with drawing color:" << ' ' << SDL_GetError() << '\n'; 
    } 
} 

renderer.clear(renderer.data()); // doesn't work: Invalid Renderer 

但我还是不明白问题出在哪里。对我来说,它似乎完成了同样的事情,但不知何故一个抛出一个错误,另一个不会。


编辑: 另一个有趣的事情,试图在renderer.clear()lldb一步直接进入到下一行,实际上并没有插手......我甚至不。

回答

0

该问题与多重链接库有关。 我使用SDL2库编译了我自己的库,然后使用我的库编译了SDL2库的可执行文件。