2014-04-10 46 views
-1

我將一些文本繪製到表面(使用SDL_ttf),然後我想更改表面上的文本。如果我只是重繪表面,文字不會消失。我已經看過幾個論壇帖子,關於如何解決這個問題,但我似乎無法弄清楚。特別是我不明白爲什麼這個解決方案不起作用:(代碼是長,所以這只是給出了要領)SDL重置表面

在類文件中聲明:

 SDL_Surface* box; // These two are initialised to the 
     SDL_Surface* boxCopy; // same image 

在我的渲染功能的開始:

 *box = *boxCopy; \\Reset box surface 

我對指針和C++(這被公認是有限的)的理解表明,這應該使框的表面指向boxCopy指向的表面。而boxCopy表面變成了盒子的副本。我不知道boxCopy如何通過這行代碼進行更改,但似乎是這樣。

+0

當然,它不會消失,如果您在表面上繪圖,它會被改變。如果您需要複製,請使用SDL_CreateRGBSurface()並手動複製像素數據。 – this

回答

0

我不知道我完全理解你的問題,但希望這可以幫助..更新文本時更容易,每當它的繪製表面更新,而不是更新實際文本時更新。它可能不是最優化的性能,但我想說在大多數情況下它更容易。

一個典型的程序循環將包括重新渲染表示屏幕的表面,然後是該表面的SDL_Flip。你當然可以優化你的重新渲染,所以你只渲染自上一幀以來實際更新的內容。這也許是你正在研究的嗎?如果是這樣,並且如果您使用下面的方法,則應該意識到新文本僅涵蓋新文本的大小,而不涵蓋整個舊文本。我通常先解決這個問題,首先繪製一個填充的矩形,然後繪製新的文本。

這裏是示出如何文本可以在表面(這裏稱爲m_Screen,這是表面翻轉篩選每幀)的簡單情況,其中i僅具有一個背景顏色上繪製一個TTF例如:

void drawText(const char* string, int x, int y, 
       int fR, int fG, int fB, int bR, int bG, int bB) 
{ 
    SDL_Color foregroundColor = { fR, fG, fB }; 
    SDL_Color backgroundColor = { bR, bG, bB }; 
    SDL_Surface* textSurface = TTF_RenderText_Shaded(m_Font, string, 
                foregroundColor, 
                backgroundColor); 
    SDL_Rect textLocation = { x, y, 0, 0 }; 
    SDL_BlitSurface(textSurface, NULL, m_Screen, &textLocation);  
    SDL_FreeSurface(textSurface); 
} 

注意這個一直呼籲的drawText(有一些合適的字體大小)之前完成:

m_Font = TTF_OpenFont("arial.ttf", size); 

,這是在清理完成:

TTF_CloseFont(m_Font);