如何清除要替换为另一个的 SDL_Surface?

Posted

技术标签:

【中文标题】如何清除要替换为另一个的 SDL_Surface?【英文标题】:How can I clear a SDL_Surface to be replaced with another one? 【发布时间】:2010-12-08 22:09:35 【问题描述】:

一直在网上找这个。

我有一个包含一些内容的 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() 函数吗?如果没有,请在您的问题中添加一些详细信息或显示一些代码。 所以我需要用 FillRect 填充 Surface 然后再次写入? @Ólafur Waage:是的,就是这个想法。 【参考方案1】:

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

【讨论】:

在对表层进行了一些修改后,它就可以工作了。谢谢。 对于 SDL2,有 SDL_RenderClear(renderer);【参考方案2】:

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:
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 );
            

【讨论】:

以上是关于如何清除要替换为另一个的 SDL_Surface?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Qt 将 Widget 替换为另一个?

如何从 UINavigationController 弹出视图并在一次操作中将其替换为另一个视图?

如何使用 Ghostscript 将 PDF 中的页面替换为另一个页面?

如何删除python中的打印文本并将其替换为另一个文本[重复]

如何在反应js中发生事件(按钮单击)时将组件替换为另一个组件

UIImage 替换为另一个不平滑的 UIImage