Как я могу очистить SDL_Surface для замены другим? - PullRequest
3 голосов
/ 22 октября 2009

Некоторое время пытался найти это онлайн.

У меня есть 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);

Ответы [ 3 ]

8 голосов
/ 22 октября 2009

Попробуйте что-то вроде: SDL_FillRect(screen, NULL, 0x000000);
в начале вашего цикла.

2 голосов
/ 22 октября 2009

Если вы рисуете что-то с прозрачностью (например, материал из SDL_ttf), прозрачные области между текстом не будут изменены, то есть предыдущие записи останутся. Обычно это не проблема, потому что обычно программа очищает буфер кадров и перерисовывает всю сцену один раз за кадр. В старые времена было обычным перерисовывать только «грязные» части экрана, но сейчас это не так часто.

1 голос
/ 22 октября 2009

Обычно я рисую на вторичной поверхности (то есть поверхности в памяти, которая не является экраном), а затем SDL_BlitSurface, когда она готова для копирования на экран. Затем вы можете очистить весь вторичный буфер (с SDL_FillRect) в следующей итерации и перерисовать все или только часть, если вы не хотите потерять всю поверхность и изменили только прямоугольник.

Таким образом, вы также получаете двойной буфер и избегаете мерцания. Также не забывайте SDL_UpdateRects после удара.

...