CAAD

Comunidad de Aventuras Conversacionales y Relatos Interactivos
Fecha actual 12 Dic 2017 20:47

Todos los horarios son UTC + 1 hora




Nuevo tema Responder al tema  [ 2 mensajes ] 
Autor Mensaje
 Asunto: Color del texto
NotaPublicado: 08 Feb 2014 20:54 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 09 Feb 2012 20:33
Mensajes: 855
Buenas!

Estoy intentando cambiar el color de texto, combinando dos colores en una misma frase. Del tipo:

Personaje dice: Hola, ¿cómo te llamas?

Por ahora la única forma que he conseguido es:

Código:
//mobile("miPersona").say("Hola, ¿cómo te llamas?");
mobile("jugador").writeDenial("\n" + self.getOutputNameThe ()+" dice:" );
mobile("jugador").write(" Hola, ¿cómo te llamas?\n");


Estaba intentando cambiar el color modificando directamente el mensaje por defecto:

world.getMessages().setMessage("someone.says.something", "$1 dice \"$text\".\n");

Pero no creo que se pueda y no encuentro ningún tipo de modificador del tipo:

world.getMessages().setMessage.setColor("someone.says.something", "$1 dice \"$text\".\n");

Existe alguna otra forma de modificar el color del texto?

_________________
Te quiero... lo siento Yoda sólo tenemos café.


Arriba
 Perfil  
 
NotaPublicado: 08 Feb 2014 22:32 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5274
Ubicación: Coruña
Bien, es una pregunta interesante. Para responderla, te cuento un poco cómo funcionan los colores por dentro en AGE.

El cliente de ventanas de AGE entiende unos códigos de color que son los colores HTML encerrados entre tantos por ciento. O sea, si escribes algo como: "Esta palabra es %#FF0000%roja%000000% pero el resto no", la palabra "roja" aparecerá en rojo, que es el color #FF0000 según la notación típica que se usa en HTML (FF, o sea 256 -el máximo- de rojo, 0 de verde y 0 de azul).

Tú podrías poner eso en un mensaje por defecto, algo como:

Código:
world.getMessages().setMessage("someone.says.something", "$1 dice %#FF0000%\"$text\".\n");


Y debería funcionar sin problema en el cliente de ventanas de AGE. Lo que pasa es que no funcionaría en otros clientes, porque no entienden esos códigos. Por ejemplo para que un jugador que se conecta por IRC vea algo en rojo, hay que darle el código del protocolo IRC para el rojo (4), para uno que se conecta por telnet el código "ANSI color" del rojo, etc. Así que si hicieras eso que he puesto, los que jugaran con el cliente de AGE lo verían bien, pero el resto verían el código en medio de la frase en vez de ver el texto en rojo.

Para hacerlo un poco mejor, se le puede preguntar al cliente por un código de color. Puedes hacer algo como:

Código:
world.getMessages().setMessage("someone.says.something", "$1 dice " + jugador.getClient().getColorCode("denial") + "\"$text\".\n");


Eso pregunta al cliente del jugador cuál es su código de color para el estilo "denial", y lo devuelve, con lo cual lo metes en la cadena. Es mejor que lo anterior, pero no es la panacea porque no vale para multijugador (el mismo mensaje hay que sacarlo con distintos códigos para diferentes jugadores que se conecten con diferentes clientes). Para monojugador seguramente te valga, aunque tienes que tener cuidado con los casos en los que el jugador lance la aventura con un cliente, guarde el estado, y luego cargue ese estado con otro cliente distinto, porque habrías fijado ya los códigos de color (si guarda la partida -log- no habría problema, porque en la carga del log getClient() te devolvería el estado nuevo y nunca se cargarían otros códigos que no fueran los del cliente nuevo). Esto no es problema si defines los mensajes en el evento intro (que se vuelve a ejecutar cuando se carga un estado) o cuando los vas a usar. Sólo sería problema si los defines en un método que no sea intro y para usarlos más adelante.

Por último, ¿qué pasa si defines los mensajes con un fichero en vez de con el método setMessage? Pues en el fichero de mensajes no puedes invocar métodos java como getColorCode(), así que ahí ya es más peliagudo. No queda más remedio que usar los códigos de bajo nivel (como %#FF0000%) y tener un condicional para cargar el fichero:

Código:
if ( jugador.getClient() instanceof ColoredSwingClient ) world.loadMessages(world.getResource("mensajesConColores.txt"));
else world.loadMessages(world.getResource("mensajes.txt"));


Lo cual no es óptimo porque supone tener dos ficheros de mensajes con mucha redundancia.

Todos estos pequeños inconvenientes (no tener una forma sencilla de meter códigos en los mensajes soportando distintos clientes en multijugador, no tener una forma sencilla de meter códigos portables en los mensajes en fichero, etc.) pienso resolverlos con una mejora que tengo pendiente del sistema de mensajes, pero son planes de futuro. Así que por ahora, te recomiendo que:

- O bien los fijes con setMessage y usando el método getColorCode para obtener los códigos de color,
- O bien, si usas ficheros de mensajes, con fichero con códigos y sin códigos y un if como el que he puesto.

Y teniendo en cuenta lo que te comenté de los estados, que si fijas los mensajes en alguno de los momentos que he dicho no será problema.

_________________
Actúa siempre de tal modo que las decisiones de tu voluntad pudiesen servir como preceptos de una legislación universal (E. Kant)


Arriba
 Perfil  
 
Mostrar mensajes previos:  Ordenar por  
Nuevo tema Responder al tema  [ 2 mensajes ] 

Todos los horarios son UTC + 1 hora


¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 4 invitados


No puede abrir nuevos temas en este Foro
No puede responder a temas en este Foro
No puede editar sus mensajes en este Foro
No puede borrar sus mensajes en este Foro

Buscar:
Saltar a:  
Desarrollado por phpBB® Forum Software © phpBB Group
Traducción al español por Huan Manwë para phpBB-Es.COM