2017-04-03 194 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); 
} 

這一切工作相當出色。我可以寫(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 ++編譯。

回答

1

在圖::使你這樣做:

SDL_RenderClear(renderer); 
SDL_RenderPresent(renderer); 

你清除渲染它會出現在屏幕前,因此它是黑色的。只需在這裏更改訂單。

+0

恐怕這是行不通的。當我更改訂單時,程序顯示完全相同的行爲。首先在SDL2中清除是爲了用最後選擇的顏色填充整個渲染器(在我的例子中是綠松石)。這是所有演示程序工作的順序(以及在引入模型類之前工作正常的順序)。 – Heatherfield

0

您正在將指針指向臨時變量並將其保存到地圖中。一旦執行流程離開該功能,該地址不再保存有效數據,並且不能可靠地訪問。可以使用例如或者(更好)使你的物體可複製。

+0

使用新的關鍵字工作就像一個魅力。通過使對象可複製到底是什麼意思?你的意思是將整個對象複製到std :: map中嗎? – Heatherfield

+0

是的,通過使地圖保持對象本身(而不是指針),因爲在這種情況下對象不是太重,並且複製它比'new'便宜得​​多。雖然你必須小心構造/析構函數。 – keltar