2017-06-22 3 views
2

J'ai récemment programmé un petit jeu d'aventure textuel utilisant SDL2 et j'ai rencontré un problème avec le retour à la ligne. J'utilise TTF_RenderText_Blended_Wrapped() pour rendre mes chaînes, ce qui me donne des lignes joliment emballées. Mais la hauteur de la ligne est un problème, les lignes semblent collées ensemble, et des lettres comme 'jqg' se chevauchent avec des lettres comme 'tli'.SDL TTF - Enroulement de ligne et changement de hauteur des lignes enroulées?

Est-ce que quelqu'un sait s'il existe un moyen de changer la hauteur de la ligne? TTF_RenderText_Blended_Wrapped() n'est toujours pas dans la documentation de SDL_ttf. Devrais-je simplement écrire ma propre fonction d'emballage de texte?

La taille de la police est 16pt, le style est TTF_STYLE_BOLD et la police peut être trouvée here. Le code ci-dessous devrait reproduire l'erreur, il n'y a presque pas de vérification d'erreur, utilisez à vos risques et périls. Voici la sortie du code:

#include <stdio.h> 
#include <SDL2/SDL.h> 
#include <SDL2/SDL_ttf.h> 

int main(int argc, char *argv[]) { 
    SDL_Window *gui; 
    SDL_Surface *screen, *text; 
    SDL_Event ev; 
    TTF_Font *font; 
    int running = 1; 

    const char *SAMPLETEXT = "This is an example of my problem, for most lines it works fine, albeit it looks a bit tight. But for any letters that \"hang\" below the line, there is a chance of overlapping with the letters below. This isn\'t the end of the world, but I think it makes for rather cluttered text.\n\nNotice the p and k on line 1/2, and the g/t on 2/3 and 3/4."; 

    // init SDL/TTF 
    SDL_Init(SDL_INIT_EVERYTHING); 
    TTF_Init(); 

    // Open and set up font 
    font = TTF_OpenFont("Anonymous.ttf", 16); 
    if(font == NULL) { 
     fprintf(stderr, "Error: font could not be opened.\n"); 
     return 0; 
    } 
    TTF_SetFontStyle(font, TTF_STYLE_BOLD); 


    // Create GUI 
    gui = SDL_CreateWindow("Example", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 
      640, 480, SDL_WINDOW_SHOWN); 
    // Grab GUI surface 
    screen = SDL_GetWindowSurface(gui); 

    // Clear screen black 
    SDL_FillRect(screen, NULL, 0); 
    // Draw some text to screen 
    SDL_Color color = {0xff, 0xff, 0xff, 0xff}; 
    text = TTF_RenderText_Blended_Wrapped(font, SAMPLETEXT, color, screen->w); 
    SDL_BlitSurface(text, NULL, screen, NULL); 

    while(running) { // Main loop 
     while(SDL_PollEvent(&ev)) { 
      switch(ev.type){ 
       case SDL_QUIT: 
        running = 0; 
        break; 
      } 
     } 

     SDL_UpdateWindowSurface(gui); // Refresh window 
     SDL_Delay(20); // Delay loop 
    } 

    // Destroy resources and quit 
    TTF_CloseFont(font); 
    TTF_Quit(); 

    SDL_FreeSurface(text); 
    SDL_DestroyWindow(gui); 
    SDL_Quit(); 

    return 0; 
} 
+0

Je ne vois pas qu'il y ait un moyen de contrôler l'espacement des lignes. [Voici un lien vers le code source] (https://fossies.org/dox/SDL2_ttf-2.0.14/SDL__ttf_8c_source.html#l01876). Avez-vous essayé une police différente? Avez-vous comparé les valeurs renvoyées par 'TTF_FontHeight()' et 'TTF_FontLineSkip()'? –

+0

Merci pour le lien. Le saut de ligne est supérieur à la hauteur, et j'ai essayé quelques polices. Je suis sûr qu'il y a une police quelque part qui fonctionnera, mais je préfère ne pas aller chercher. –

+0

Pouvez-vous poster la police que vous utilisez? J'ai essayé avec quelques polices sur mon système et n'ai pas pu reproduire le problème. – Tim

Répondre

1

La solution la plus simple est de trouver une police qui ne dispose pas de cette question. Le FreeMono font a plus spacing:

using the FreeMono.ttf

En regardant la source code for TTF_RenderUTF8_Blended_Wrapped, qui est appelé par TTF_RenderText_Blended_Wrapped, il n'y a aucun moyen configurable pour définir l'espacement entre les lignes. Voir const int lineSpace = 2; sur la ligne 1893.

Cependant, même si lineSpace est défini sur 2, il n'est pas utilisé lors du calcul de l'adresse de chaque pixel à rendre. Ceci est mise en place effective l'espacement des lignes à 0. Je l'ai signalé comme un bogue dans la bibliothèque de SDL_ttf: https://bugzilla.libsdl.org/show_bug.cgi?id=3679

j'ai pu résoudre le problème dans SDL_ttf 2.0.14 avec le changement suivant:

--- a/SDL_ttf.c Fri Jan 27 17:54:34 2017 -0800 
+++ b/SDL_ttf.c Thu Jun 22 16:54:38 2017 -0700 
@@ -1996,7 +1996,7 @@ 
     return(NULL); 
    } 

- rowSize = textbuf->pitch/4 * height; 
+ rowSize = textbuf->pitch/4 * (height + lineSpace); 

    /* Adding bound checking to avoid all kinds of memory corruption errors 
     that may occur. */ 

avec le patch ci-dessus appliqué, votre programme d'exemple montre la ligne correcte avec l'espacement Anonymous font:

correct line spacing with patched SDL_ttf