-1

(SDL_ttf を使用して) サーフェスにテキストを描画してから、サーフェス上のテキストを変更したいと考えています。表面を再描画しただけでは、テキストは消えません。問題を解決する方法についていくつかのフォーラムの投稿を見てきましたが、それを理解できないようです. 特に、このソリューションが機能しない理由を理解できません:(コードが長いため、これは本質的なものを提供するだけです)

宣言されたクラスファイルで:

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

私のレンダリング機能の開始時:

       *box = *boxCopy; \\Reset box surface

ポインターと C++ (確かに制限されています) についての私の理解では、これにより、box が指す面が boxCopy が指す面と等しくなるはずです。代わりに、boxCopy サーフェスが box のコピーになります。このコード行で boxCopy を変更する方法はわかりませんが、それが起こっているようです。

4

1 に答える 1

0

あなたの問題を完全に理解しているかどうかはわかりませんが、これが役立つことを願っています.実際のテキストが更新されるたびに更新するよりも、描画されているサーフェスが更新されるたびにテキストを更新する方が簡単です. 最適化されたパフォーマンスではないかもしれませんが、ほとんどの場合は簡単だと思います。

典型的なプログラム ループには、画面を表すサーフェスの再レンダリングと、それに続くこのサーフェスの SDL_Flip が含まれます。もちろん、再レンダリングを最適化して、最後のフレーム以降に実際に更新されたものだけをレンダリングすることができます。それはおそらくあなたが取り組んでいることですか?その場合、以下の方法を使用する場合、新しいテキストは古いテキスト全体ではなく、新しいテキストのサイズのみをカバーすることに注意してください。私は通常、最初に塗りつぶされた長方形を描き、次に新しいテキストを描くことでこれを解決します。

これは、背景色が 1 つしかない単純なケースで、表面 (ここでは m_Screen と呼ばれ、フレームごとに画面に反転される表面) にテキストを描画する方法を示す 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);
于 2014-05-02T11:21:27.513 に答える