(SDL2) 让对象自身呈现会得到黑屏
(SDL2) Letting an object render itself gives black screen
我正在使用SDL2制作一个应用程序,旨在在单独的窗口中显示图形。为此,我有一个名为 figure 的类,带有以下标头:
class figure
{
private:
short window_width;
short window_height;
SDL_Window* window = NULL;
SDL_Renderer* renderer = NULL;
SDL_Event fig_handler;
public:
figure(short fig_typ);
void render();
short figure_type;
};
以及以下实现:
figure::figure(short fig_typ)
{
window_width = 840;
window_height = 680;
window = SDL_CreateWindow( "Demo Window", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, window_width, window_height, SDL_WINDOW_SHOWN );
if (window==NULL)
{
std::cout << "Window could not be created! SDL_Error: " << SDL_GetError() << std::endl;
}
renderer = SDL_CreateRenderer( window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC );
if (renderer==NULL)
{
std::cout << "Window could not be created! SDL_Error: " << SDL_GetError() << std::endl;
}
// Set default colour to turquise
SDL_SetRenderDrawColor(renderer, 45, 164, 132, SDL_ALPHA_OPAQUE);
figure_type = fig_typ;
}
void figure::render()
{
while (SDL_PollEvent(&fig_handler))
{
if (fig_handler.type == SDL_QUIT)
{
// Do things here
}
}
SDL_RenderClear(renderer);
SDL_RenderPresent(renderer);
SDL_Delay(0);
}
这一切都运作良好。我可以在 (true){fig1.render();} 时编写,绿松石窗口将一直保持到我关闭程序。但是在我的程序中,我希望这些图形中的许多共存,并且为了简化过程,我决定制作一个新的类模型来跟踪这些数字。
标题:
class model
{
public:
model();
void add_figure(short index, short fig_typ);
bool update();
private:
std::map<short, figure*> figure_map;
};
实现:
model::model()
{
// Initialize SDL
if( SDL_Init( SDL_INIT_VIDEO ) < 0 )
{
std::cout << "SDL could not initialize! SDL_Error: " << SDL_GetError() << std::endl;
}
}
void model::add_figure(short index, short fig_typ)
{
figure tempFigure(fig_typ);
std::pair<short, figure*> tempPair(index, &tempFigure);
figure_map.insert(tempPair);
}
bool model::update()
{
for (std::map<short, figure*>::iterator it = figure_map.begin(); it != figure_map.end(); ++it)
{
it->second->render();
}
return true;
}
神秘的是,当我创建一个模型对象并给它一个数字,然后调用 while (true) {model_object.update();} 时,窗口变黑了。当我从 figure 对象中删除事件处理时(就像我最初打算的那样),SDL 甚至懒得做一个漂亮的窗口:我只得到一个模糊的白色或黑色窗口,具体取决于我删除处理的哪些部分。
SDL 似乎甚至没有花时间很好地渲染所有内容。另一个 StackOverflow-post 建议在某处添加 SDL_Delay(0) 以使 SDL 喘口气(如您所见,我将其放入 figure::render()),但到目前为止它没有区别。
我该怎么做才能像它应该的那样渲染我的窗口,但仍然保持这个结构:一个对象调用另一个对象的函数来绘制窗口的结构。
附言我正在使用装有MacOS的笔记本电脑工作,并使用g ++进行编译。
在 figure::render 中,您正在执行此操作:
SDL_RenderClear(renderer);
SDL_RenderPresent(renderer);
在将渲染器呈现到屏幕之前,您正在清除渲染器,因此它是黑色的。只需在此处更改顺序即可。
您正在获取指向临时变量的指针并将其保存到地图中。一旦执行流离开此函数,此地址将不再保存有效数据,并且无法可靠地访问。要么使用例如new
或(更好)使您的对象可复制。
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- CMake-按正确顺序将项目与C运行时对象文件链接
- 空基优化子对象的地址
- 将对象数组的引用传递给函数
- 你能重载对象变量名本身返回的内容吗
- C++使用整数的压缩数组初始化对象
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 将对象移动到std::shared_ptr
- 代理对象的常量正确性
- 提升 ASIO 无法识别计时器对象
- 将Ref对象作为类成员
- 将包含C样式数组的对象初始化为成员变量(C++)
- 如何返回一个类的两个对象相加的结果
- 使用std::函数映射对象方法
- 是否需要删除包含对象的"pair"?
- 如何在自删除后将对象设置为nullptr
- (SDL2) 让对象自身呈现会得到黑屏
- SDL2 无法创建窗口,因为它找不到匹配的 GLX 视觉对象
- Ubuntu的SDL2.0.2安装中丢失的对象