4

一段时间以来一直试图在网上找到这个。

我有一个包含一些内容的 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

4 回答 4

11

尝试类似: SDL_FillRect(screen, NULL, 0x000000);
在循环开始时。

于 2009-10-21T23:53:54.873 回答
3

如果您正在绘制具有透明度的内容(例如来自 SDL_ttf 的内容),则文本之间的透明区域不会改变,这意味着之前的写入将保留。这通常不是问题,因为通常的行为是程序清除帧缓冲区并每帧重绘整个场景一次。在过去,只重绘屏幕的“脏”部分是很常见的,但现在这并不常见。

于 2009-10-21T23:58:51.017 回答
2

我通常做的是绘制到辅助表面(即不是屏幕的内存中表面),然后SDL_BlitSurface当它准备好复制到屏幕上时。然后,您可以在下一次迭代中清除整个辅助缓冲区(使用SDL_FillRect),如果您不想丢失整个表面而只更改一个矩形,则重新绘制所有内容或仅部分内容。

这样,您还可以获得双缓冲并避免闪烁。blitting后也不要忘记SDL_UpdateRects

于 2009-10-21T23:52:46.577 回答
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 );
            }
于 2019-08-31T17:38:29.180 回答