SDL2 Wrapper class 抱怨“渲染器无效”
SDL2 Wrapper class complains `Invalid Renderer`
我正在尝试围绕一些 SDL2 class 编写 C++ 包装器 class。
现在我有了这个工作代码,它会显示红屏 5 秒(如您所见,我的包装器 classes 在命名空间 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
的包装器 class 中,我有一个 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
直接进入下一行,而没有实际介入……我什至没有。
问题与多重链接库有关。
我用 SDL2 库编译了我自己的库,然后用我的库 和 SDL2 库编译了我的可执行文件。
我正在尝试围绕一些 SDL2 class 编写 C++ 包装器 class。
现在我有了这个工作代码,它会显示红屏 5 秒(如您所见,我的包装器 classes 在命名空间 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
的包装器 class 中,我有一个 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
直接进入下一行,而没有实际介入……我什至没有。
问题与多重链接库有关。 我用 SDL2 库编译了我自己的库,然后用我的库 和 SDL2 库编译了我的可执行文件。