SDL_Surfaceをクリアして別のSDL_Surfaceに置き換えるにはどうすればよいですか?
質問
しばらくオンラインでこれを見つけようとしているのを見た。
SDL_Surfaceにコンテンツが含まれています(あるテキストでは、別のコンテンツではスプライトの一部です)。ゲームループ内で、データを画面に表示します。しかし、それから再びループし、古いデータを置き換えず、単に上書きします。したがって、テキストの場合、それは混乱になります。
SDL_FreeSurfaceを試しましたが、うまくいきませんでした。別の方法を知っている人はいますか?
fpsStream.str("");
fpsStream << fps.get_ticks();
fpsString = fpsStream.str();
game.fpsSurface = TTF_RenderText_Solid(game.fpsFont, fpsString.c_str(), textColor);
game.BlitSurface(0, 0, game.fpsSurface, game.screen);
解決
次のようなものを試してください:
SDL_FillRect(screen、NULL、0x000000);
ループの始めに。
他のヒント
透明なもの(SDL_ttfなど)を描画する場合、テキスト間の透明な領域は変更されません。つまり、以前の書き込みは残ります。通常、プログラムはフレームバッファをクリアし、フレームごとにシーン全体を再描画するため、これは問題になりません。昔は、画面の「汚れた」部分だけを再描画するのが一般的でしたが、今ではあまり一般的ではありません。
通常は、セカンダリサーフェス(つまり、画面ではないメモリ内のサーフェス)に描画し、画面にコピーする準備ができたら SDL_BlitSurface
を描画します。その後、次の反復でセカンダリバッファー全体を( SDL_FillRect
を使用して)クリアし、表面全体を失いたくなくて長方形のみを変更したい場合は、すべてまたは一部のみを再描画できます。
このようにして、ダブルバッファリングを取得し、ちらつきを防ぎます。また、ブリット後の SDL_UpdateRects
も忘れないでください。
所属していません StackOverflow