Pregunta

He estado tratando de encontrar esto en línea por un tiempo ahora.

Tengo una SDL_Surface con algo de contenido (en uno es texto, en otro es parte de un sprite). Dentro del bucle del juego, obtengo los datos en la pantalla bien. Pero luego se repite y no reemplaza los datos antiguos, sino que solo los escribe. Así que en el caso del texto, se convierte en un desastre.

He intentado SDL_FreeSurface y no funcionó, ¿alguien sabe de otra manera?

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

Solución

Pruebe algo como: SDL_FillRect (pantalla, NULL, 0x000000);
al comienzo de tu bucle.

Otros consejos

Si está dibujando algo con transparencia (por ejemplo, cosas de SDL_ttf), las áreas transparentes entre el texto no se alterarán, lo que significa que las escrituras anteriores se mantendrán. Esto no suele ser un problema porque el comportamiento habitual es que el programa borre el búfer de cuadros y vuelva a dibujar la escena completa una vez por cuadro. En los viejos tiempos era común volver a dibujar las partes "sucias" de la pantalla, pero eso no es tan común ahora.

Lo que hago generalmente es dibujar en una superficie secundaria (es decir, una superficie en memoria que no es la pantalla) y luego SDL_BlitSurface cuando está lista para ser copiada en la pantalla. Luego puede borrar todo el búfer secundario (con SDL_FillRect ) en la próxima iteración y volver a dibujar todo o solo una parte si no desea perder toda la superficie y solo cambió un rectángulo.

De esta manera, también obtienes doble búfer y evitas parpadeos. Además, no olvide SDL_UpdateRects después de borrar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top