2017-04-03 6 views
-1

私は別のウィンドウにグラフを表示するための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); 

あなたはレンダラをクリアしている、したがって、それは黒です:

答えて

1

の図で::あなたがこれをやっているレンダリングします。ここで注文を変更してください。

+0

これはうまくいきません。注文を変更すると、プログラムは全く同じ動作を表示します。 SDL2で最初にクリアするのは、レンダラー全体を最後に選択した色(例ではターコイズ)で塗りつぶすことです。これは、すべてのデモプログラムが動作する順序(およびモデルクラスを導入する前にうまく動作する順序)です。 – Heatherfield

0

一時変数へのポインタをマップに保存しています。実行フローがこの機能を離れると、このアドレスはもはや有効なデータを保持せず、確実にアクセスすることができなくなる。例えば、 newまたは(より良い)オブジェクトをコピー可能にします。

+0

新しいキーワードを使用して、魅力のように働きました。オブジェクトをコピー可能にすることによって、正確にはどういう意味ですか?オブジェクト全体をstd :: mapにコピーすることを意味しますか? – Heatherfield

+0

はい、ポインタ保持オブジェクト自体を(ポインターではなく)作成することで、オブジェクトが重すぎないので、コピーは 'new'よりはるかに安いです。あなたはコンストラクタ/デストラクタに注意する必要があります。 – keltar

関連する問題