2014-11-16 18 views
5

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 
+0

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 .. –

+0

@ 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

+0

"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'? –

risposta

0

So che questa domanda è un po 'datata ma ho forse avuto un problema simile. Ho risolto il problema con semplicemente chiamata SDL_DestroyTexture() ogni volta che ho usato TTF_Render_Text_Blended() :)

+0

Heheh, vecchia domanda, ma non obsoleto :) Grazie per il suggerimento, proverò quando tornerò al rendering del testo! Cerco di ricordare di aggiornare questo elemento qui, ma purtroppo molte cose sono già cambiate (versione SDL, versione del compilatore, ecc. Ecc.). – MaKo

Problemi correlati