私は別のウィンドウにグラフを表示するための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);
}
このことを行うには、私は次のヘッダーでの図と呼ばれるクラスを持っています。 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;
}
そして不思議、I、モデルオブジェクトを作成し、それに数字を与え、続いて(TRUE){model_object.updateながら呼び出し();}、ウィンドウが黒くなります。図形オブジェクトからイベント処理を削除すると(私が意図したように)、SDLは素敵なウィンドウを作ることさえありません。私は、処理のどの部分を削除するかによって、白または黒のウィンドウがぼやけてしまいます。
SDLはすべてをきれいにレンダリングする時間がかかりません。別のStackOverflow-postはSDL_Delay(0)を行のどこかに追加してSDLを息を止めさせるように提案しました(私はfigure :: render()に入れましたが)これまでのところ違いはありません。
私のウィンドウをレンダリングするには、どうすればよいのでしょうか?しかし、この構造を維持してください:オブジェクトが別のオブジェクトの機能を呼び出してウィンドウを描画する構造。
p.s.私はMacOSのラップトップから作業していて、g ++を使ってコンパイルしています。あなたが画面にそれを提示する前に
SDL_RenderClear(renderer);
SDL_RenderPresent(renderer);
あなたはレンダラをクリアしている、したがって、それは黒です:
これはうまくいきません。注文を変更すると、プログラムは全く同じ動作を表示します。 SDL2で最初にクリアするのは、レンダラー全体を最後に選択した色(例ではターコイズ)で塗りつぶすことです。これは、すべてのデモプログラムが動作する順序(およびモデルクラスを導入する前にうまく動作する順序)です。 – Heatherfield