CAAD

Comunidad de Aventuras Conversacionales y Relatos Interactivos
Fecha actual 29 Jun 2017 13:34

Todos los horarios son UTC + 1 hora




Nuevo tema Responder al tema  [ 7 mensajes ] 
Autor Mensaje
NotaPublicado: 26 Nov 2013 07:17 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 09 Feb 2012 20:33
Mensajes: 855
Hola, estoy intentando presentar el texto el pantalla por coordenadas. Entre lo que he encontrado está:

Código:
drawString
public abstract void drawString(String str,
              int x,
              int y)
Draws the text given by the specified string, using this graphics context's current font and color. The baseline of the leftmost character is at position (x, y) in this graphics context's coordinate system.
Parameters:
str - the string to be drawn.
x - the x coordinate.
y - the y coordinate.
Throws:
NullPointerException - if str is null.
See Also:
drawBytes(byte[], int, int, int, int), drawChars(char[], int, int, int, int)


En el enlace:
http://docs.oracle.com/javase/7/docs/ap ... ang.String, int, int)

Pero no me funciona o por lo menos no sé hacerlo funcionar, si es que se puede claro. A ver si no sirve para AGE y estoy perdiendo el tiempo. He colocado en mi código las instrucciones:
Código:
Graphics.drawString("hola mundo",10,10);


Luego probé
Código:
java.awt.Graphics.drawString("hola mundo",10,10);


y las dos con el mismo resultado:
Código:
**********BeanShell Syntax Error Report***********
*In code for object: [World: Mi world, internal handle eu.irreality.age.World@d4c191]
*Loaded to call method intro (with arguments: [ eu.irreality.age.Player:20000002:jugador ])
*Location: inline evaluation of: ``///source( world.getResource("milib.bsh"));   /*  * COLORES DEL TEXTO:  * 0: NOR . . . ''
*Message: Sourced file: inline evaluation of: ``intro( arg0);'' : Cannot reach instance method: drawString( java.lang.String, int, int ) from static context: java.awt.Graphics
**************************************************


Se puede usar o estoy perdiendo el tiempo?. Como puedo presentar el texto en pantalla por coordenadas?
Estaba pensando luego en el método de tomar las dimensiones de la pantalla y en función también del tamaño de la fuente pues por saltos de linea '\n' y espacios '\s'... si no queda otra alternativa.

Gracias

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


Arriba
 Perfil  
 
NotaPublicado: 26 Nov 2013 12:09 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5265
Ubicación: Coruña
Puedes utilizar ese método drawString, pero lo que te ha faltado es acceder a una instancia de la clase Graphics. Es un método de instancia, no de clase, así que necesitas una instancia que será el objeto Graphics correspondiente al componente (ventana, panel, etc.) donde quieres dibujar.

No sé si cuando hablas de dibujar en la pantalla estás pensando en dibujar literalmente en la pantalla (o sea, sin depender de ninguna ventana, incluso fuera de la ventana de AGE si cuadra) o en dibujar en lo que sería "la pantalla de la aventura", en donde aparece el texto. Lo primero se podría hacer creando un componente transparente y dibujando en él, pero imagino que te refieres a lo segundo, ¿no?

En ese caso, puedes obtener el objeto Graphics del área de texto haciendo:

Código:
if ( jugador.getClient() instanceof ColoredSwingClient )
{
  Graphics g = jugador.getClient().getTextArea().getGraphics();
}


Y luego sobre ese objeto g es sobre el que llamarías drawString, o cualquiera de los otros métodos de dibujado que tiene la clase Graphics de Java que has visto.

Pero hay varias cosas que tendrás que tener en cuenta:

1. Esto sólo funcionará si el jugador utiliza el cliente de ventanas de AGE. Si está jugando por el cliente de línea de comandos, por telnet, por IRC, etc. no funcionará (como es natural). De ahí el if que he puesto. Si es un texto fundamental el que quieres dibujar, por lo tanto, deberías programar una alternativa para que la gente que use otros clientes pueda verlo. Asimismo, al estar dibujando el texto directamente con drawString, me parece que los ciegos que usen un lector de pantalla no lo podrán escuchar.

2. Ten en cuenta que el área de texto es una cosa muy larga de la cual el scroll te muestra una parte. Si no recuerdo mal (habría que mirar la API de Swing para asegurarse, pero creo que es así) si tú dibujas algo con coordenada y=10, lo dibujarás en la coordenada 10 del total de esa área, no de la parte que es visible. Swing proporciona métodos para saber qué parte es la visible, si lo que quieres es dibujar en la coordenada 10 de la parte que se ve en un momento dado. Si no me equivoco (ten en cuenta que aquí te respondo un poco con chicles y alambres porque esto ya no es AGE, es Java Swing, y yo no soy un gran experto en Swing - voy mirando la documentación y tirando, pero las interfaces de usuario para nada son mi especialidad) tienes que hacer getVisibleRect() y eso te da las coordenadas del rectángulo visible.

3. Aun teniendo en cuenta todo esto, ten en cuenta que dibujando en el área de texto vas a competir con el propio Java Swing. O sea, por ejemplo, si el jugador selecciona un texto, Swing va a dibujar el resaltado de la selección. Si cuadra encima de lo que tú has dibujado, se lo va a "comer", no sé si me explico. Como ves, el tema es que dibujar libremente sobre una interfaz de ventanas tiene sus problemas ya que hay que llevarse bien con los componentes que ya están, no es como cuando programábamos juegos en Basic para el MSX y dominábamos toda la pantalla dándonos igual todo lo demás.

Si quieres evitar lidiar con los puntos 2 y 3, siempre puedes crear un frame. El frame lo creas tú con el tamaño que quieras bien definido, no tiene scroll, y no compites con nada (ni AGE ni Java van a pintar nada ahí que no sea lo que tú mandes). Claro que dependerá un poco de para qué quieras usar el texto exactamente.

_________________
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  
 
NotaPublicado: 26 Nov 2013 12:30 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 09 Feb 2012 20:33
Mensajes: 855
Bueno, era para crear una presentación, una pantalla inicial. No sé si merece la pena tanto jaleo para una presentación. Probaré lo que me has comentado, en función de los resultados, lo haré de una forma u otra y si veo que al final son más desventajas que ventajas, pues la dejo tal y como lo tengo ahora.

Gracias!

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


Arriba
 Perfil  
 
NotaPublicado: 26 Nov 2013 14:13 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5265
Ubicación: Coruña
Ten en cuenta también que en el área de texto de AGE puedes mostrar (directamente con métodos sencillitos de AGE, sin ir a la API de Java) tanto imágenes estáticas como GIF's animados. Igual eso también te puede ser útil para hacer una presentación.

_________________
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  
 
NotaPublicado: 26 Nov 2013 18:50 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 09 Feb 2012 20:33
Mensajes: 855
Al-Khwarizmi escribió:
Ten en cuenta también que en el área de texto de AGE puedes mostrar (directamente con métodos sencillitos de AGE, sin ir a la API de Java) tanto imágenes estáticas como GIF's animados. Igual eso también te puede ser útil para hacer una presentación.


Me has leído la mente. He echo pruebas insertando imágenes y me he decidido hacerlo así.

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


Arriba
 Perfil  
 
NotaPublicado: 04 Dic 2013 22:46 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 09 Feb 2012 20:33
Mensajes: 855
Durante la presentación tengo frases que aparecen en intervalos de tiempo determinado, del estilo:

Código:
mobile("jugador").write("Frase XXXXX");  // la frase
Thread.sleep(2000);                            // la pausa
mobile("jugador").write("La siguiente frase.");
Thread.sleep(2000);                           
.
.
.
etc


En la ejecución, durante las pausas, si tecleas intro, aparece el eco en pantalla antiestético:

Código:
Frase XXXX
>>  !Tiempo de pausa que he pulsado intro, aparece en pantalla un retorno de carro poco estético.
La siguiente frase
.
.


Es posible bloquear la entrada de texto durante las pausa????, El cortarle las manos al jugador no lo veo factible :D

Gracias!!!!

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


Arriba
 Perfil  
 
NotaPublicado: 04 Dic 2013 23:27 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5265
Ubicación: Coruña
Creo que probablemente la forma más sencilla de evitar ese problema estético sea desactivar el eco y "pasar" de los comandos.

Para desactivar el eco, lo harías con:

Código:
cliente = jugador.getClient();
if ( cliente instanceof ColoredSwingClient )
  cliente.setEchoEnabled(false);


Y para volver a activarlo, lo mismo, pero con cliente.setEchoEnabled(true).

Eso lo puedes combinar con una propiedad de una entidad abstracta que indique que el juego está en pausa, y redefiniendo el preprocessCommand para que ignore todos los comandos (por si el jugador, en vez de teclear simplemente intro, introduce algo).

Si esto no te llega y lo que quieres es literalmente desactivar el campo de entrada, también se puede, sólo que es un poco más complejo porque no hay método específico en AGE sino que hay que hacerlo con Java Swing. Sería algo como:

Código:
//desactivar la entrada
java.lang.Runnable desactivador = new java.lang.Runnable ( public void run()
{
  jugador.getClient().getInputField().setEditable(false);
} );
javax.swing.SwingUtilities.invokeAndWait(desactivador);

//volver a activar la entrada
java.lang.Runnable activador = new java.lang.Runnable ( public void run()
{
  jugador.getClient().getInputField().setEditable(true);
} );
javax.swing.SwingUtilities.invokeAndWait(activador);


Realmente lo que hace el trabajo es el setEditable, pero todo el tema de Runnable, invokeAndWait, etc. es necesario porque ese método hay que invocarlo en el hilo de eventos de Swing, podría dar problemas invocarlo en el hilo del mundo de AGE.

_________________
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  [ 7 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 2 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