2016-03-12 85 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庫的可執行文件。