如何清除要替换为另一个的 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?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 UINavigationController 弹出视图并在一次操作中将其替换为另一个视图?
如何使用 Ghostscript 将 PDF 中的页面替换为另一个页面?
如何删除python中的打印文本并将其替换为另一个文本[重复]