CAAD

Comunidad de Aventuras Conversacionales y Relatos Interactivos
Fecha actual 23 Feb 2020 03:35

Todos los horarios son UTC + 1 hora




Nuevo tema Responder al tema  [ 9 mensajes ] 
Autor Mensaje
NotaPublicado: 16 Jun 2009 20:24 
Desconectado
Grafista
Grafista
Avatar de Usuario

Registrado: 04 Sep 2008 17:23
Mensajes: 745
Hola! Tengo una nueva pregunta: ¿cómo puede almacenarse una cadena de texto cualquiera introducida por el jugador en una variable?

Porque puede hacerse algo así, ¿verdad? He estado ojeando los primeros capítulos del Designer Manual y he intentado programarlo yo mismo, sin éxito. Finalmente me he rendido y he optado por pediros ayuda.

Gracias anticipadas! Un saludo.


Última edición por Makinaimo el 16 Jun 2009 22:11, editado 1 vez en total

Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 16 Jun 2009 22:06 
Desconectado
Semimomio
Semimomio
Avatar de Usuario

Registrado: 24 Ago 2007 00:41
Mensajes: 2023
Ubicación: Chile
En una variable local o global no se puede.

Pero sí que puedes almacenarla en cualquier array. Si la cadena de texto ya la tienes en la forma "hola, esto es una cadena", puedes hacer...

Previamente declarado un array con espacio suficiente para cada caracter...

Código:
Array miArray buffer 100;


y luego, puedes "imprimir el texto en el array"

Código:
PrintToBuffer(miArray, 100, "hola"); ! o tambien...
PrintToBuffer(miArray, 100, miTexto);


*El segundo parámetro (100) corresponde al tamaño máximo del array en el que se va a escribir.

Lo anterior sirve tanto para Z como para Glulx si estás usando INFSP6 y la Lib. 6/11.

Para imprimir el contenido del array tendrás que hacerlo carácter por caracter con, evidentemente, un bucle For. La cantidad de carácteres impresa está dada por 'array-->0' y el primer caracter comienza en la posición 'array->WORDSIZE' (observa que el primero es un palabra de 4 bytes "-->" y el segundo es de 2 bytes "->", cuidado con eso). En el bucle, imprimirías cada contenido de la forma...

Código:
print (char) array->WORDSIZE+i; ! siendo 'i' el contador del For


Pues eso, suerte! :D

P.S: si lo que planeabas era guardas la entrada de texto del jugador en una variable... eso sí que no tengo muy claro como hacerlo, por que no lo he estudiado. Lo que te acabo de explicar sirve para imprimir una cadena de texto "inmutable" en un array. Con ello, puedes manipular la cadena a tu antojo y luego imprimirla de la manera que te plazca. Eso. :)

_________________
Eliuk Blau
eliukblau (AT) gmail.com
http://www.caad.es/eliukblau/


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 17 Jun 2009 22:37 
Desconectado
Semimomio
Semimomio
Avatar de Usuario

Registrado: 24 Ago 2007 00:41
Mensajes: 2023
Ubicación: Chile
Makinaimo, de la mano de Mel te paso la siguiente sugerencia:

Citar:
Una solución a la captura de lo que ha tecleado el usuario está en el código fuente de Casi Muerto, en el que la consola cuando examinas su pantalla muestra el contenido de lo tecleado y de las respuestas dadas.


Saludos!

_________________
Eliuk Blau
eliukblau (AT) gmail.com
http://www.caad.es/eliukblau/


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 18 Jun 2009 11:08 
Desconectado
Grafista
Grafista
Avatar de Usuario

Registrado: 04 Sep 2008 17:23
Mensajes: 745
Muchas gracias por la ayuda, Eliuk.
Ahora mismo le voy a echar un ojo al código de Casi Muerto. En cualquier caso, gracias al Designer Manual de Graham he conseguido guardar la entrada de teclado en un array usando el siguiente código:


Código:
Array  texto_de_usuario    -> 28;
[ PideTexto;
    print "Texto: ";
    texto_de_usuario->0 = 25;
    read texto_de_usuario 0;
];


Funciona. Pero me acabo de dar cuenta que funciona sólo en Máquina-Z. Compilando para GLULX salta el siguiente error:

Código:
line 525: Error:  *** Statement code gen: Can't generate yet ***

>     read text_de_usuario


¿Sabe alguien si existe una función similar a 'read' que funcione en GLULX?

Gracias, y un saludo!


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 18 Jun 2009 11:23 
Desconectado
Implementador
Implementador
Avatar de Usuario

Registrado: 10 Mar 2004 11:58
Mensajes: 1817
Ubicación: Madrid
Para Glulx se me ocurre un método un tanto bruto, que tiene ciertas pegas, y éstas son que la lectura se realizará después de que el parser haya realizado ciertos cambios en la cadena introducida.
Por ejemplo, si hemos escrito "dame" la cadena que leerá será algo como "da a Player", las eñes serán enes, y las mayúsculas y acentos desaparecerán, entre otras cosas.

Supongamos que queremos registrar los 5 primeros caracteres de la primera palabra que el jugador escriba, almacenándolos en las variables v1, v2, v3, v4, y v5:

Código:
[BeforeParsing i j thisword thislength cuenta;
       v1=0;v2=0;v3=0;v4=0;v5=0;
   for (i=parse-->0,j=1:j<=i:j++) !ATENCIÓN; en Zcode es "parse->1", en Glulx es "parse-->0"
           !!!parse-->0 devuelve el número de palabras escritas,num_words = parse-->0;
   {!mnfo
      thisword = WordAddress(j);
      thislength = WordLength(j);
if ( thisword -> 0 >= 'a' && thisword -> 0 <= 'z' )
{!ii
switch (cuenta){
0: v1=thisword->0;
1: v2=thisword->1;
2: v3=thisword->2;
3: v4=thisword->3;
4: v5=thisword->4;
}
cuenta++;
}!ii
}
];


Luego para imprimirlo, hacemos un loop, y vamos imprimiendo carcater por caracter desde V1 a Vx, hasta que un valor sea igual a 0.

Es un método nefasto, pero es el único que se me ocurre con lo que sé. Sólo sería útil para reconocer cosas simples como un input tal que:
Código:
Dime tu nombre:
>>Pepe
Hola Pepe

También me interesaría conocer una forma mejor.

Saludos

PD: Esto, combinado con las explicaciones de escribir en un array de Eliuk podría tener una aspecto mejor.

_________________
_/ /\ R e \_


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 18 Jun 2009 12:07 
Desconectado
xyzzy

Registrado: 09 Mar 2004 22:50
Mensajes: 9150
No sé si os servirá pero en la versión glulx de "Dios en zapatillas", el parser captura el nombre que el jugador le pone a la criatura y a partir de ahí el jugador ya puede referirse a la criatura llamándola por el nombre que le ha dado.
La rutina que hace esto fue en gran parte desarrollada por Zak, porque sobrepasaba con mucho mis conocimientos de inform.

Lo que sigue es la rutina que captura lo que el jugador escribe.

Código:
! Ahora los trucos con la gramática. Hace falta una rutina que pille
! cualquier palabra que haya escrito el jugador y la almacene
! temporalmente en un array, desde el cual se copiará posteriormente
! al nombre2 del ser
Array _temporal_ -> 121;
!Global _len_; !Jen (la declaro antes para poderla utilizar en el objeto vacio_)
[ CualquierPalabra i dir ;
    dir=DireccionDePalabra(np);
    _len_=LongitudDePalabra(np++);
    if (_len_>=MAX_LETRAS_EN_NOMBRE)
   _len_=MAX_LETRAS_EN_NOMBRE-1;
    for (i=0:i<_len_:i++) _temporal_->i = dir->i;

    ! El while qu viene ahora es para que el parser ignore cualquier
    ! cosa que el jugador teclee despues del nombre del objeto
    ! creado. Asi, se admite: CREA PEPE ASDKL ASKLD pero el nombre del
    ! objeto creado será solo "PEPE".
    !
    ! Si eliminaras ese while, ante CREA PEPE ASDFGH el parser
    ! responderá "No entendí la última parte ¿Quieres crear eso?"
    !
    ! Elige la opción que más te guste

    while(SiguientePalabraParar()~=-1) ;
    rtrue;
];


No sé si servirá para este caso.

El código fuente del juego está en:
http://www.geocities.com/jene_if/descar ... _glulx.zip

Un saludo
Jenesis


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 18 Jun 2009 12:09 
Desconectado
Grafista
Grafista
Avatar de Usuario

Registrado: 04 Sep 2008 17:23
Mensajes: 745
Hola. No he encontrado el código fuente de CasiMuerto (aunque por lo que he visto, la aventura funciona bajo máquina-z y no glulx, así que tampoco es exactamente lo que busco ahora), en cambio si que he encontrado un ejemplo de uso de eventos de entrada de teclado: inputeventtext.inf (en http://www.eblong.com/zarf/glulx/index.html). Muy interesante y parece bastante sencillo. Pero la verdad es que yo no acabo de entenderlo bien...

¿Resultaría muy complicado programar eso que dice Jarel?

Citar:
Dime tu nombre:
>>Pepe
Hola Pepe


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 18 Jun 2009 12:13 
Desconectado
Grafista
Grafista
Avatar de Usuario

Registrado: 04 Sep 2008 17:23
Mensajes: 745
Gracias Jenesis por la aportación!


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 18 Jun 2009 18:25 
Desconectado
Grafista
Grafista
Avatar de Usuario

Registrado: 04 Sep 2008 17:23
Mensajes: 745
Uhm. Copiando código de inputeventtext.inf he conseguido almacenar la entrada de texto del jugador en un array de caracteres, tanto en Máquina-Z como Glulx. Hay muchas cosas que aún no entiendo bien y supongo que mi función ReadPlayersName pueda programarse mejor, pero al menos parece funcionar:


Código:
Array  player_name    -> 28;      ! Guarda el nombre del jugador
#Ifdef TARGET_ZCODE;         ! Máquina-Z
[ ReadPlayersName;
    print "Nombre: ";
    player_name->0 = 25;
    read player_name 0;
];
#Ifnot;                  ! Glulx
Array char_buf -> 25;
[ ReadPlayersName i j ch;
    print "Nombre ";
    glk($00D0, gg_mainwin, char_buf, 25, 0); ! request_line_event
    glk($00C0, gg_event); ! select
    if (gg_event-->0 == 3 && gg_event-->1 == gg_mainwin) {
   player_name->0 = 25;
   player_name->1 = gg_event-->2;
   j = 2;
   for (i=0 : i<gg_event-->2 : i++) {
       ch = char_buf->i;
       player_name->(j) = ch;
       j++;
   }
    }
];
#Endif;


Con una función PrintArray() para imprimir arrays de caracteres (esta si es facil de programar) podemos usar el contenido de player_name para hacer cosas del estilo de:

Código:
Nombre: "Pepe"  !! función ReadPlayersName
Hola Pepe.          !! print "Hola "; PrintArray(player_name);


Un saludo!


Arriba
 Perfil  
 
Mostrar mensajes previos:  Ordenar por  
Nuevo tema Responder al tema  [ 9 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 5 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:  
cron
Desarrollado por phpBB® Forum Software © phpBB Group
Traducción al español por Huan Manwë para phpBB-Es.COM