[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