现在试图在网上找到这个。
我有一个带有一些内容的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);
答案 0 :(得分:8)
尝试以下方法:
SDL_FillRect(screen, NULL, 0x000000);
在你的循环开始。
答案 1 :(得分:2)
如果您正在绘制具有透明度的内容(例如来自SDL_ttf的内容),则文本之间的透明区域将不会更改,这意味着之前的写入将保留。这通常不是问题,因为通常的行为是程序清除帧缓冲区并每帧重绘一次整个场景。在过去,通常只重绘屏幕上的“脏”部分,但现在不常见。
答案 2 :(得分:1)
我通常做的是绘制到辅助表面(即,不是屏幕的内存表面),然后在准备好复制到屏幕时SDL_BlitSurface
。然后,您可以在下一次迭代中清除整个辅助缓冲区(使用SDL_FillRect
)并重新绘制所有内容,或者只是部分内容,如果您不想丢失整个曲面并且只更改了矩形。
这样,您也可以获得双重缓冲并避免闪烁。在blitting之后也不要忘记SDL_UpdateRects
。
答案 3 :(得分:0)
while( !quit )
{
while( SDL_PollEvent( &e ) != 0)
{
if( e.type == SDL_QUIT )
{
quit = true;
}
else if( e.type == SDL_KEYDOWN)
{
**SDL_FillRect(screenSurface, NULL, 0x000000);**
switch(e.key.keysym.sym)
{
case SDLK_w:
CurrentSurface = ImageSurfaces[ KEY_PRESS_SURFACE_UP ];
break;
case SDLK_d:
CurrentSurface = ImageSurfaces[ KEY_PRESS_SURFACE_RIGHT ];
break;
case SDLK_s:
CurrentSurface = ImageSurfaces[ KEY_PRESS_SURFACE_DOWN ];
break;
case SDLK_a:
CurrentSurface = ImageSurfaces[ KEY_PRESS_SURFACE_LEFT ];
break;
default:
CurrentSurface = ImageSurfaces[ KEY_PRESS_SURFACE_DEFAULT ];
break;
}
}
}
SDL_BlitSurface(CurrentSurface, NULL, screenSurface, NULL);
SDL_UpdateWindowSurface( window );
}