EDIT: Anche se il problema esiste ancora, non sono stato in grado di riprodurlo abbastanza frequentemente per esaminarlo più da vicino. Vedi più informazioni alla fine della domanda.sdl ttf_rendertext_blended non riesce in modo casuale
Ho iniziato a sviluppare un gioco e attualmente sto scrivendo una libreria di base. Sto usando il linguaggio di programmazione D con SDL-2 e OpenGL 3 (usando i collegamenti Derelict3), su Linux Mint 13 (Maya). Il compilatore è DMD64 D Compiler v2.067.1, e ricostruisco binari ogni volta con 'rdmd'.
Per il rendering (modifica) del testo, creo glifi su richiesta. Il pezzo di codice che uso per questo è:
class Font {
...
Texture render(char c) {
if(!(c in rendered)) rendered[c] = texture(to!string(c));
return rendered[c];
}
Texture texture(string text) {
SDL_Color color={255, 255, 255, 255};
auto bitmap = TTF_RenderText_Blended(
font,
std.string.toStringz(text),
color
);
if(!bitmap) {
throw new TTFError(
"TTF_RenderText_Blended: " ~
to!string(TTF_GetError()) ~ ": '" ~ text ~ "'"
);
}
auto texture = new Texture(bitmap);
SDL_FreeSurface(bitmap);
return texture;
}
Il problema è che questo non riesce puramente in modo casuale. A volte funziona senza problemi. Quando non riesce a rappresentare un glifo, è interessante che non riesca a rendere lo stesso glifo più e più volte. Ecco un esempio in cui cattura l'eccezione butto:
...
TTF_RenderText_Blended: Text has zero width: '9'
TTF_RenderText_Blended: Text has zero width: '6'
TTF_RenderText_Blended: Text has zero width: '9'
TTF_RenderText_Blended: Text has zero width: '6'
TTF_RenderText_Blended: Text has zero width: '9'
TTF_RenderText_Blended: Text has zero width: '6'
...
(punteggio sto stampa su schermo, altri numeri che mostrano bene, tranne quei pochi). I numeri TTF_RenderText_Blended non riescono a eseguire il rendering variano da esecuzione a esecuzione e, come accennato, ogni volta restituisce tutti i numeri.
Un dettaglio è che le stringhe statiche che eseguo il rendering prima di entrare nel loop di gioco non hanno ancora fallito il rendering, solo singole lettere che uso per modificare i testi.
Sono praticamente fuori da ogni idea e non ho trovato nulla relativo a questo problema cercando sul web. Qualsiasi idea di cercare soluzioni è molto apprezzata.
SITUAZIONE ATTUALE: ho aggiornato compilatore di DMD 2.067.1 e il problema rimane (compilatori utilizzati finora: 2.066.1, 2.067.1). L'intera - diciamo famiglia progetto è in github al momento:
https://github.com/mkoskim/games
La funzione di rendering dei glifi di testo si trova in questo file:
https://github.com/mkoskim/games/blob/master/engine/ext/font.d
... ed è usato da qui:
https://github.com/mkoskim/games/blob/master/engine/ext/gui/label.d
Il problema si verifica ma inly/più frequentemente nel gioco pacman (anche se molto raramente proprio in questo momento):
https://github.com/mkoskim/games/tree/master/testbench/pacman
Se volete provarlo, prima, leggere la (si spera abbastanza completo) istruzioni per l'installazione:
https://github.com/mkoskim/games/blob/master/INSTALL
Il progetto è realizzato per Linux Mint Maya a 64 bit e al momento non è così user-friendly e portatile dal punto di vista dell'edilizia. Pacman è l'unica demo che (si spera) funziona senza controller di gioco.Dopo la corretta installazione di librerie e strumenti necessari, si può costruire con il comando:
games/testbench/pacman$ make default
Solo per sperimentazioni, prova a inserire alcuni spazi attorno al carattere, come '" "~ c' invece di solo' a! Stringa (c) 'nella funzione di rendering e vedere cosa succede. Forse a SDL non piace il rendering di un singolo carattere .. –
@ AdamD.Ruppe, ho già provato cose del genere. Ad ogni modo, ho cambiato il codice in questo modo: 'if (! (C in rendering)) reso [c] = texture (std.string.format ("% c ", c));', e il primo test eseguito mi ha dato infinite elenco di: '... TTF_RenderText_Blended: Il testo ha larghezza zero: '7' ...' – MaKo
"A volte funziona senza problemi. Quando non riesce a visualizzare un glifo, è interessante che non riesca a visualizzare lo stesso glifo ancora e ancora." Riuscirà a rendere nuovi glifi dopo che il primo è fallito? Cioè è possibile che smetta di essere in grado di renderizzare completamente glifi, ad eccezione di quelli memorizzati in 'render'? –