CAAD

Comunidad de Aventuras Conversacionales y Relatos Interactivos
Fecha actual 19 Ago 2017 12:21

Todos los horarios son UTC + 1 hora




Nuevo tema Responder al tema  [ 7 mensajes ] 
Autor Mensaje
 Asunto: Texto input
NotaPublicado: 18 Ago 2015 18:42 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 09 Feb 2012 20:33
Mensajes: 855
Puedo escribir algo, que no sea el prompt, en el cuadro de texto del entrada.

¿Existe algún "setText" o algo al que pueda acceder?, del tipo

aPlayer.getIO().setText("coger cosa");

Que el resultado sea en el input:

>> coger cosa

Es decir, como forceCommand("coger cosa"), pero que no ejecutara directamente el comando, que lo muestre en el cuadro de texto del input y necesite la pulsación de enter.

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


Arriba
 Perfil  
 
 Asunto: Re: Texto input
NotaPublicado: 19 Ago 2015 05:54 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 09 Feb 2012 20:33
Mensajes: 855
Mirando las fuentes en el repositorio, en la clase FancyJTextField.java, sólo encontré public String getText(), pero no un setText(). De todas formas no sé si es la clase correcta, AGE tienes varios clientes y no aclaro muy bien.

De todas formas dándole más vuelta al asunto creo que lo que tenía pensado sería demasiado complicado. Tuve que hacer para un trabajo y buscador dinámico de palabras, frases en java. En un cuadro de texto ibas tecleando y a medida que tecleabas palabras iban apareciendo los expresiones más frecuentes ordenados por frecuencia... como el autocompletar de google.

Pero aparte del getText(), setText(), me haría falta keydown, keypress... eventos, listener etc y no sé hasta que punto puedo hacer eso en AGE.

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


Arriba
 Perfil  
 
 Asunto: Re: Texto input
NotaPublicado: 19 Ago 2015 09:23 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5268
Ubicación: Coruña
Efectivamente, FancyJTextField es la clase que representa el campo de texto de entrada en el cliente de ventanas de AGE, y puedes implementar la funcionalidad que quieres trabajando con él (ojo, para ese cliente... como siempre, tendrías que meter un chequeo de cliente para implementar esas funcionalidades específicas).

Para obtener ese campo de texto a partir del cliente, sería con jugador.getClient().getInputField().

Sobre los métodos que tiene, fíjate que FancyJTextField no es más que una subclase de la clase estándar de Java JTextField, que está sobreescrita para añadirle el soporte de prompts. Por lo tanto, puedes acceder a todos los métodos públicos de JTextField y de sus sucesivas superclases, que incluyen todo lo que has dicho: setText(), addKeyListener() para añadir escuchadores para eventos de teclado, y un largo etc.

http://docs.oracle.com/javase/7/docs/ap ... Field.html

Puedes hacer todo lo que te permita Java, o sea de todo, vamos.

_________________
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  
 
 Asunto: Re: Texto input
NotaPublicado: 19 Ago 2015 15:01 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 09 Feb 2012 20:33
Mensajes: 855
Ok gracias!

Acaba de hacer una prueba,

JTextField elInput = mobile("jugador").getClient().getInputField();
elInput.setText("mirar");

y al pulsar enter ha ejecutado el comando mirar. :P

Sigo haciendo pruebas a ver lo que saco.

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


Arriba
 Perfil  
 
 Asunto: Re: Texto input
NotaPublicado: 20 Ago 2015 19:01 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 09 Feb 2012 20:33
Mensajes: 855
Bueno he avanzado un poco pero me surgió un problema. Al crear el listener en la intro del world:

Código:
elInput = mobile("jugador").getClient().getInputField();
elInput.addKeyListener( this );


Llegaba al método void keyPressed(KeyEvent arg0), (lo comprobé con un write de cada tecla pulsada) , pero el input se quedaba en blanco. Creo que corta el flujo normal del programa.
He tenido que ir rellenando el input "a mano", no sé hasta que punto esto debo hacerlo así, pero no sé porque el input no se rellena al poner el listener.
El problema de rellenarlo a mano es que debo tener en cuenta, espacio, tab, enter...
Código:
void keyPressed(KeyEvent arg0) {

         // Enter
        if ( arg0.getKeyCode() == 10 )
        {
            txtInput = "";
        }
        // Espacio
        else if ( arg0.getKeyCode() == 32 )
        {
           txtInput = txtInput + " ";
           elInput.setText ( txtInput );   
        }
        // BackSpace
        else if ( arg0.getKeyCode () == 8 )
        {
            if ( txtInput.length() > 0 )
            {
                txtInput = txtInput.substring (0, txtInput.length() -1 );
                elInput.setText ( txtInput );
            }
        }
        else if ( caracterImprimible ( arg0.getKeyCode() ) )
        {
            txtInput = txtInput + arg0.getKeyChar();
            elInput.setText ( txtInput );
        }   
       
    }


Funcionar funciona y me reconoce las órdenes normalmente. Pero me falta contemplar, tabulador, cursor izq, drech....
Para la lista de sugerencias guardaré lo que lleva pulsado el jugador y el texto que está impreso en el input. El jugador puede haber escrito "coger p", y el input esté sugiriendo "coger pistola"...
Como crearé la lista de sugerencias... eso aún está por decidir.

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


Arriba
 Perfil  
 
 Asunto: Re: Texto input
NotaPublicado: 21 Ago 2015 00:24 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5268
Ubicación: Coruña
Hmm, la verdad es que no sé exactamente por qué el primer listener te "cancelaría" la entrada. En principio, añadir un listener no debería interrumpir el flujo normal del programa, ni impedir que se ejecuten los listeners por defecto que hacen que el componente funcione de forma normal (salvo que los quites, o que en tu listener consumas el evento explícitamente). Imagino que te habrá mordido algún fallo sutil, o bien relacionado con el momento en que se genera ese evento (ten en cuenta que es antes de que la letra en cuestión aparezca en el campo de texto), o bien con el orden de los listeners.

En todo caso, te puedo decir que escuchar un keyPressed seguramente no sea la forma óptima de hacer lo que quieres hacer, porque es un evento de muy bajo nivel. Ten en cuenta que es el evento de presionar una tecla, a pelo (ni siquiera presionarla y soltarla, se activa cuando bajas el dedo). Te va a decir que se pulsó la tecla c siempre que se pulse esa tecla, sea para escribir una c, una C (Shift+c) o por ejemplo un Ctrl+c que no escribe nada sino que copia. Y no tiene en cuenta formas de que aparezca una c en el campo de texto sin que sea pulsando la tecla c (por ejemplo, pegándola del portapapeles). Tampoco sé qué pasa si el usuario realmente no tiene un teclado sino otra cosa (por ejemplo está usando entrada por voz); pero sospecho que no será bonito. Si quieres que el campo de texto tenga toda la funcionalidad que hoy por hoy esperamos, te vas a encontrar un montón de casos particulares si vas por ese camino.

Hay otro evento llamado keyTyped que es de algo más alto nivel, y ya sería bastante mejor. Se activa cuando se "typea" algo (cuando el teclado considera que se ha tecleado un carácter dado), y te permite tener en cuenta modificadores como Ctrl, Shift, etc. fácilmente.

Pero la manera mejor para tu propósito (por lo que yo conozco, que disto mucho de ser experto en Swing) con clases como DocumentListener (obteniendo el objeto Document que es "la capa modelo" del campo de texto, y se obtiene con getDocument()) porque ahí no estás escuchando las teclas que pulsa el usuario, sino realmente los caracteres que aparecen/desaparecen/cambian en el campo de texto, sea por el motivo que sea. Que realmente es lo que quieres hacer.

La verdad es que no son clases fáciles de usar. Yo interactué con ellas para AGE y fue un ejercicio de mirar mucha documentación, cagarla a menudo y mucha prueba y error. Claro que en realidad, toda la programación de las interfaces gráficas de AGE fue un ejercicio de mirar mucha documentación, cagarla a menudo y mucha prueba y error. El tema de interfaces nunca ha sido lo mío...

En suma, si quieres hacer una solución buena yo miraría la clase Document y relacionadas, que son las realmente pensadas para este tipo de cosas y puedes hacer virguerías. Si no tienes muchas pretensiones y te vale algo básico y con alguna limitación pero más fácil de hacer, puedes recurrir a keyTyped. Pero keyPressed para esto no lo tocaría ni con un palo, te morderá seguro (en lo relacionado con entrada de caracteres digo - para cosas como mirar si el jugador pulsa el tabulador, tal vez te sirva).

_________________
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  
 
 Asunto: Re: Texto input
NotaPublicado: 21 Ago 2015 18:05 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 09 Feb 2012 20:33
Mensajes: 855
Al-Khwarizmi escribió:
Hmm, la verdad es que no sé exactamente por qué el primer listener te "cancelaría" la entrada. En principio, añadir un listener no debería interrumpir el flujo normal del programa, ni impedir que se ejecuten los listeners por defecto que hacen que el componente funcione de forma normal


Bueno pues el problema era que debía implementar los tres métodos de la inferfaz keyListener,

Código:
void keyTyped(KeyEvent arg0)
void keyReleased(KeyEvent arg0)
void keyPressed(KeyEvent arg0)


aún cuando el cuerpo del método esté vacío. Estaba dejando comentado el método keyReleased, y provocaba fallo.

Ya de esta forma he podido acceder a todos los eventos del teclado sin alterar el funcionamiento por defecto del input del texto.

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


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 1 invitado


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:  
cron
Desarrollado por phpBB® Forum Software © phpBB Group
Traducción al español por Huan Manwë para phpBB-Es.COM