es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo puedo obtener el texto completo en SDL? (No en la consola)

Estoy creando un menú para un juego en C++ y tengo un problema cuando leo un archivo de texto (.cfg), y quiero mostrarlo en la pantalla (con SDL, no en la consola).

El problema es que en SDL, solo obtengo la última línea. ¿Por qué sucede esto?

Aquí está mi código:

fstream characters;
characters.open("characters.cfg", ios::in);
while (getline(characters, line))
cout << line << endl;

Y creo una cadena para mostrarlo con SDL_ttf:

void renderUI() {
SDL_Surface* textSurface;
SDL_Texture* textTexture;
SDL_Rect textRect;

SDL_Color white = { 255,255,255 };

textRect.w = 250;
textRect.h = 20;
textRect.x = 150;
textRect.y = 200;

string names = line;

textSurface = TTF_RenderText_Blended(gameFont, names.c_str(), white);
textTexture = SDL_CreateTextureFromSurface(renderer, textSurface);

if (textSurface == NULL)
{
    cout << "TTF_RenderText_Solid() Failed: " << TTF_GetError() << endl;
    TTF_Quit();
    SDL_Quit();
    exit(1);
}


SDL_RenderCopy(renderer, textTexture, NULL, &textRect);
}

Y aquí una foto para mostrar que obtengo el texto completo en la consola, pero no en SDL:

FOTO DE EJEMPLO: Enlace a la foto

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema es que solo estás almacenando la última línea del archivo de texto en la variable de cadena names, por lo que solo se muestra la última línea en la pantalla con SDL. Esto se debe a que estás sobrescribiendo el contenido de names en cada iteración del bucle while. Lo que necesitas hacer es concatenar cada línea a la variable names, de modo que contenga todo el contenido del archivo de texto.

    Puedes modificar tu código de la siguiente manera:

    fstream characters;
    characters.open("characters.cfg", ios::in);
    string names; // defínelo fuera del bucle while
    while (getline(characters, line))
      names += line + "\n"; // concatena cada línea con un carácter de nueva línea
    cout << names << endl;
    

    Esto concatenará cada línea con un carácter de nueva línea y almacenará el texto completo en la variable names. Luego, puedes pasar names a la función SDL_ttf como antes.

    void renderUI() {
      SDL_Surface* textSurface;
      SDL_Texture* textTexture;
      SDL_Rect textRect;
    
      SDL_Color white = { 255,255,255 };
    
      textRect.w = 250;
      textRect.h = 20;
      textRect.x = 150;
      textRect.y = 200;
    
      string names;
      fstream characters;
      characters.open("characters.cfg", ios::in);
      while (getline(characters, line))
        names += line + "\n";
    
      textSurface = TTF_RenderText_Blended(gameFont, names.c_str(), white);
      textTexture = SDL_CreateTextureFromSurface(renderer, textSurface);
    
      if (textSurface == NULL)
      {
        cout << "TTF_RenderText_Solid() Failed: " << TTF_GetError() << endl;
        TTF_Quit();
        SDL_Quit();
        exit(1);
      }
    
      SDL_RenderCopy(renderer, textTexture, NULL, &textRect);
    }
    

    Esto debería mostrar el contenido completo del archivo de texto en la pantalla con SDL.

Comments are closed.