Pergunta

tentado encontrar isso on-line por um tempo agora.

Eu tenho um SDL_Surface com algum conteúdo (em um lo do texto, em outro é uma parte de um sprite). Dentro do loop do jogo eu recebo os dados para a multa tela. Mas então ele faz um loop novamente e ele não substitui os dados antigos, mas apenas escreve sobre ele. Assim, no caso do texto, torna-se uma confusão.

Eu tentei SDL_FreeSurface e não funcionou, alguém sabe outra maneira?

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);
Foi útil?

Solução

Tente algo como: SDL_FillRect(screen, NULL, 0x000000);
no início do seu ciclo.

Outras dicas

Se você está desenhando algo com transparência (eg. Coisas de SDL_ttf), em seguida, as áreas transparentes entre o texto não será alterado, ou seja, as gravações anteriores permanecerá. Isso geralmente não é um problema porque o comportamento usual é para o programa para limpar o frame buffer e redesenhar toda a cena uma vez por quadro. Nos velhos tempos, era comum para redesenhar apenas as partes 'sujas' da tela, mas que não é tão comum agora.

O que eu geralmente está atraindo a uma superfície secundária (isto é, uma superfície na memória que não é a tela) e, em seguida, SDL_BlitSurface quando ele está pronto para ser copiado para a tela. então você pode limpar todo o buffer secundário (com SDL_FillRect) na próxima iteração e redesenhar tudo ou apenas uma parte, se você não quer perder toda a superfície e só mudou um retângulo.

Desta forma, você também terá doublebuffering e cintilação evitar. Também não se esqueça SDL_UpdateRects após blitting.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top