我正在使用SDL2製作應用程序,這意味着要在單獨的窗口中顯示圖形。要做到這一點,我有一個名爲數字與下面的頭類:(SDL2)讓對象渲染本身會產生黑屏
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;
}
而神祕,當我創建一個模型對象,並給它一個數字,然後調用,而(真){model_object.update ();},窗口變黑。當我從圖形對象中刪除事件處理時(就像我原本打算的那樣),SDL甚至不打算製作一個漂亮的窗口:根據我刪除的處理的哪些部分,我只會看到模糊的白色或黑色窗口。
似乎SDL甚至沒有花時間很好地呈現所有內容。另一個StackOverflow-post建議在行的某處添加SDL_Delay(0)以使SDL屏住呼吸(正如你所看到的,我把它放到了figure :: render()中),但到目前爲止它沒有什麼區別。
我能做些什麼來渲染我的窗口,但它仍然保持這種結構:一個對象調用另一個對象的函數來繪製窗口的結構。
附:我正在用MacOS筆記本電腦工作,並使用g ++編譯。
恐怕這是行不通的。當我更改訂單時,程序顯示完全相同的行爲。首先在SDL2中清除是爲了用最後選擇的顏色填充整個渲染器(在我的例子中是綠松石)。這是所有演示程序工作的順序(以及在引入模型類之前工作正常的順序)。 – Heatherfield