如何清除SDL_Surface以替换另一个?

时间:2009-10-21 23:45:21

标签: c++ sdl clear 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);

4 个答案:

答案 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 );
            }