Come posso cancellare un SDL_Surface da sostituire con un altro?
Domanda
Sto provando a trovarlo online da un po 'di tempo.
Ho una SDL_Surface con alcuni contenuti (in uno è il testo, in un altro è una parte di uno sprite). All'interno del loop di gioco ottengo i dati sullo schermo bene. Ma poi si riavvia di nuovo e non sostituisce i vecchi dati ma ci scrive solo su di essi. Quindi, nel caso del testo, diventa un casino.
Ho provato SDL_FreeSurface e non ha funzionato, qualcuno conosce un altro modo?
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);
Soluzione
Prova qualcosa del tipo:
SDL_FillRect (schermo, NULL, 0x000000);
all'inizio del ciclo.
Altri suggerimenti
Se stai disegnando qualcosa con trasparenza (es. cose da SDL_ttf), le aree trasparenti tra il testo non saranno modificate, il che significa che le scritture precedenti rimarranno. Questo di solito non è un problema perché il normale comportamento è che il programma cancelli il frame buffer e ridisegni l'intera scena una volta per frame. Ai vecchi tempi era comune ridisegnare solo le parti "sporche" dello schermo, ma ora non è così comune.
Quello che faccio di solito è disegnare su una superficie secondaria (ovvero una superficie in memoria che non è lo schermo) e quindi SDL_BlitSurface
quando è pronto per essere copiato sullo schermo. È quindi possibile cancellare l'intero buffer secondario (con SDL_FillRect
) nella successiva iterazione e ridisegnare tutto o solo una parte di se non si desidera perdere l'intera superficie e modificare solo un rettangolo.
In questo modo, ottieni anche il doppio buffering ed evita lo sfarfallio. Inoltre, non dimenticare SDL_UpdateRects
dopo averlo inserito.