2014-11-16 37 views
5

EDYCJA: Nawet jeśli problem nadal istnieje, nie udało mi się go odtworzyć wystarczająco często, aby go bliżej przyjrzeć. Zobacz więcej informacji na końcu pytania.sdl ttf_rendertext_blended losowo nieudane


Zacząłem rozwijać grę i obecnie piszę do niej podstawową bibliotekę. Używam języka programowania D z SDL-2 i OpenGL 3 (przy użyciu wiązań Derelict3), na Linux Mint 13 (Maya). Kompilatorem jest DMD64 D Compiler v2.067.1, a ja przebudowuję binarnie za każdym razem z "rdmd".

Aby renderować (zmieniać) tekst, tworzę glify na żądanie. Kod, którego używam, to:

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; 
} 

Problem polega na tym, że to się nie powiedzie losowo. Czasami działa bez żadnych problemów. Kiedy nie uda się wyrenderować glifu, interesujące jest to, że nie będzie on renderował tego samego glifu w kółko. Oto przykład przy wychwytywaniu wyjątku, który rzucam:

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

(Drukuję wynik na ekranie, inne liczby są wyświetlane poprawnie oprócz tych kilku). Cyfry TTF_RenderText_Blended nie wyświetlają się w różny sposób od uruchomienia do uruchomienia, a jak wspomniano, od czasu do czasu renderuje wszystkie liczby.

Jedną z informacji jest to, że ciągi statyczne renderowane przed wprowadzeniem pętli do gier nie zostały jeszcze renderowane, tylko pojedyncze litery używam do zmiany tekstów.

Jestem prawie z jakichkolwiek pomysłów i nie znalazłem nic związanego z tym problemem, przeszukując sieć. Wszelkie pomysły na szukanie rozwiązań są bardzo doceniane.


Obecna sytuacja: I aktualizowany kompilator DMD 2.067.1 i problem pozostaje (kompilatory używane do tej pory: 2.066.1, 2.067.1). Całość - powiedzmy rodzina projekt jest w github w tej chwili:

https://github.com/mkoskim/games

tekst funkcja renderowania glifów znajduje się w tym pliku:

https://github.com/mkoskim/games/blob/master/engine/ext/font.d

... i to jest używany stąd:

https://github.com/mkoskim/games/blob/master/engine/ext/gui/label.d

problem pojawia mA inly/najczęściej w gry Pacman (choć bardzo rzadko właśnie teraz):

https://github.com/mkoskim/games/tree/master/testbench/pacman

Jeśli chcesz ją wypróbować, najpierw należy zapoznać się z (mam nadzieję wystarczająco kompletne) Instrukcja instalacji:

https://github.com/mkoskim/games/blob/master/INSTALL

Projekt jest przeznaczony dla 64-bitowej wersji systemu Linux Mint Maya i obecnie nie jest tak przyjazny dla użytkownika i przenośny z punktu widzenia budowania. Pacman jest jedynym demo, które (miejmy nadzieję) działa bez kontrolera gier.Po udanej instalacji wymaganych bibliotek i narzędzi, można zbudować go z poleceniem:

games/testbench/pacman$ make default 
+0

Tylko do eksperymentów, spróbuj umieścić kilka spacji wokół znaku, takich jak '" "~ c' zamiast po prostu' na! Ciąg (c) 'w funkcji renderowania i zobacz, co się stanie. Może SDL nie lubi renderowania pojedynczego znaku ... –

+0

@ AdamD.Ruppe, już wypróbowałem takie rzeczy. W każdym razie, zmieniłem kod w ten sposób: 'if (! (C w renderowanym)) renderowane [c] = tekstura (std.string.format ("% c ", c));', a pierwszy test uruchomił mnie nieskończenie lista: '... TTF_RenderText_Blended: Tekst ma zerową szerokość: '7' ...' – MaKo

+0

"Czasami działa bez żadnych problemów.Jeśli nie uda się renderować glifu, to jest interesujące, że nie będzie renderować tego samego glifu w kółko." Czy uda mu się renderować nowe glify po tym, jak pierwsza się nie powiodła? To znaczy. czy to możliwe, że przestaje być w stanie renderować glify całkowicie, z wyjątkiem tych zapisanych w 'renderowanym '? –

Odpowiedz

0

Wiem, że to pytanie jest trochę przestarzały, ale może miał podobny problem. Naprawiłem to, po prostu wywołując SDL_DestroyTexture() za każdym razem, gdy użyłem TTF_Render_Text_Blended() :)

+0

Heheh, stare pytanie, ale nie nieaktualne :) Dzięki za wskazówkę, spróbuję, gdy wrócę do renderowania tekstu! Staram się pamiętać o aktualizacji tego elementu tutaj, ale niestety wiele rzeczy już się zmieniło (wersja SDL, wersja kompilatora itp.). – MaKo