[C con Clase] ayuda con emular carácter de escape \n

Antonio Arjona antonio.arjona.melches en gmail.com
Lun Ene 14 18:29:47 CET 2013


Hola a todos.

mi duda es la siguiente:

El codigo que expongo a continuación me funciona, pero a lo mejor me 
estoy complicando la vida...
¿a alguien se le ocurre una solución mas sencilla?

El motivo es :
     Estoy usando unas bibliotecas gráficas para videojuegos (SDL, y 
SDL_ttf) la primera me permite crear un entorno gráfico, eventos de 
teclado, ratón, .. etc., y la segunda le añade el uso de fuentes de 
texto, pero con una gran limitación, no reconoce los caracteres de 
escape por ej.: "\n", imprimiendo todo el texto seguido.

la unica forma que se me ocurre de emular el uso de \n es coger cada 
parte del texto hasta dicho carácter, he imprimirlo como linea 
independiente, y para ello utilizo strtok().
Si bien no me equivoco, esta función modifica la cadena de origen, por 
lo que tengo que trabajar en una copia, que creo de forma dinámica.

NOTA: he puesto en ROJO lo referente al método que empleo, el resto 
pertenece al uso de las bibliotecas antes mencionadas.

[code]
class fuentes
{

     TTF_Font *fuente;   // almacena la fuente
     SDL_Color color;     // almacena el color en tres campos r,g,b.
     SDL_Rect pos;         // objeto de coordenadas de intercambio

public:

     /** imprime texto.
         texto = texto a imprimir
         r, g, b = componentes RGB del color del texto
         x, y = coordenadas horizontal y vertical desde la esquina 
superior izquierda de la pantalla
         superficie = imagen destino, donde se imprimirá el texto
      **/
     void imprime(const char *texto, int r, int g, int b, int x, int y, 
SDL_Surface *superficie)
     {
         SDL_Surface *img;   // aquí genera una linea de texto en forma 
de imagen

//como no se que tamaño tendrá creo un array de forma dinamica
         char *copytxt;

         copytxt = new char[1+strlen(texto)]; // nº caracteres + nulo
         strcpy(copytxt, texto); // y copio el texto a manejar

         char *linea;

         color.r=r;
         color.g=g;
         color.b=b;

linea = strtok(copytxt, "\n");
         if(linea)
         {
             img = TTF_RenderText_Blended(fuente, linea, color);
             pos.x=x;
             pos.y=y;
             SDL_BlitSurface(img,NULL, superficie, &pos);
         }

         // Las siguientes llamadas con NULL
         while(linea)
         {
linea = strtok(NULL, "\n");
             if(linea)
             {
                 img = TTF_RenderText_Blended(fuente, linea, color);
                 //SDL_SetAlpha(img,1,alpha);
                 pos.x=x;
                 pos.y += TTF_FontLineSkip(fuente);
                 SDL_BlitSurface(img,NULL, superficie, &pos);

             }
         }
         SDL_FreeSurface(img); // libera la memoria de la imagen
delete[] copytxt; // libera la memoria del texto
     }

     ... // otras funciones

};
[/code]
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20130114/57e49d30/attachment.html>


Más información sobre la lista de distribución Cconclase