代码之家  ›  专栏  ›  技术社区  ›  Ólafur Waage

如何清除要替换为另一个SDL_曲面的SDL_曲面?

  •  3
  • Ólafur Waage  · 技术社区  · 15 年前

    我已经在网上找了一段时间了。

    我试过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);
    
    3 回复  |  直到 4 年前
        1
  •  11
  •   oold    15 年前

    尝试以下方法: SDL_FillRect(screen, NULL, 0x000000);

        2
  •  3
  •   Kylotan    15 年前

        3
  •  2
  •   Tamas Czinege    15 年前

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

    这样,您还可以获得双缓冲并避免闪烁。也别忘了 SDL_UpdateRects 在闪电战之后。

        4
  •  0
  •   kamalesh biswas    5 年前
    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 );
                }