(SDL2)让对象渲染本身会产生黑屏

时间:2017-04-03 21:22:59

标签: c++ macos sdl

我正在使用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);
}

这一切都运作良好。我可以写while(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();}时,窗口变黑。当我从图形对象中删除事件处理时(就像我原本想要的那样),SDL甚至都懒得做一个漂亮的窗口:我只会得到一个模糊的白色或黑色窗口,这取决于我删除的处理部分。 / p>

似乎SDL甚至没有花时间很好地渲染一切。另一个StackOverflow-post建议在行的某处添加SDL_Delay(0)以使SDL屏住呼吸(正如你所看到的,我将它放入figure :: render())但到目前为止它没有什么区别。

我可以做什么来渲染我想要的窗口,但仍然保持这种结构:一个对象调用另一个对象的函数来绘制窗口的结构。

P.S。我正在使用MacOS笔记本电脑,并使用g ++进行编译。

2 个答案:

答案 0 :(得分:1)

在图中::渲染你这样做:

SDL_RenderClear(renderer);
SDL_RenderPresent(renderer);

您在将渲染器呈现到屏幕之前清除渲染器,因此它是黑色的。只需在此更改订单。

答案 1 :(得分:0)

您正在指向临时变量并将其保存到地图中。一旦执行流程离开此功能,该地址就不再保存有效数据,并且无法可靠地访问。使用例如new或(更好)使您的对象可以复制。