CAAD

Comunidad de Aventuras Conversacionales y Relatos Interactivos
Fecha actual 21 Oct 2019 21:52

Todos los horarios son UTC + 1 hora




Nuevo tema Responder al tema  [ 5 mensajes ] 
Autor Mensaje
NotaPublicado: 18 Oct 2004 15:45 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 09 Sep 2004 12:53
Mensajes: 1145
Creo que me vais a ver bastante por esta parte del foro. Espero que no os canséis de mi :)

Mi nuevo problema. Estaba haciendo un par de PNJ y decidí­ unificar en una clase las rutinas que me hací­an falta. En las rutinas de los PNJ utilizaba mucho la siguiente construcción:
Código:
if (parent(self) == localizacion)
  {
  print "El pirata dice: ~Espera un momento que apunto esto.~^";
  }

Así­ que decidí­ crear, en la clase PNJ el siguiente método:
Código:
decir [frase;
  if (parent(self) == localizacion)
    {
    print (_El) self, " dice: ~", frase, "~^";
    }
  ]

que serí­a llamado:
Código:
Pirata.decir("Espera un momento que apunto eso.");

Pero ahora me encuentro con el problema de que quiero que la frase que se dice tenga modificadores:
Código:
Pirata.decir("Tengo ", (numero) monedas, " monedas.");

Pero claro, ésto, con las "," no me lo acepta como cadena para enviar al método. He intentado meterlo primero todo en una variable pero tampoco me deja asignarle el valor a la variable.

¿Hay alguna forma unir la cadena antes de enviarla?

Muchas gracias.

_________________
- Lenko -


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 19 Oct 2004 18:43 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 09 Sep 2004 12:53
Mensajes: 1145
Veo que no he tenido mucho éxito :)

Después de mucho leer y probar me he convencido por fin que el Inform es totalmente incapaz de manejar cadenas de ninguna forma.

Lo más cerca que he estado es haciendo la función "decir" tenga un número variable de parámetros. El problema es que no hay forma de que diferencie un parámetro que contenga un string de un número porque la variable del string contiene su dirección que es un número.

La única solución serí­a enviar todos los parámetros como string (para después poder hacer los "print (string) param1, (string) param2...") pero por lo que veo es imposible hasta crear una función que genere una cadena que contenga un número pasado como parámetro (es decir, una función que yo le pase un 2 y devuelva un "2").

Es decir, ahora tengo algo así­ de feo:
Código:
decir [param1 param2 param3;
  print (_El) self, " dice: ~", (string) param1;
  if (param2 ~= 0)
    {
    print (string) param2;
    if (param3 ~= 0)
      {
      print (string) param3;
      }
    }
  print "~^";
  ]


... que me permite enviar hasta 3 parámetros string en la cadena, pero eso no me sirve de nada si no consigo una forma de pasar números a cadenas para hacer algo así­:
Código:
Pirata.decir("Hay ", NumACad(cantidad), " personas bailando");

Vamos, que me doy por vencido salvo que alguien me pueda echar un cabo (si ha entendido este galimatí­as, claro).

_________________
- Lenko -


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 19 Oct 2004 19:54 
Desconectado
Guionista
Guionista
Avatar de Usuario

Registrado: 09 Mar 2004 21:54
Mensajes: 378
Ubicación: La red
Lenko, creo que te complicas demasiado la vida para conseguir ese efecto, y efectivamente el manejo de cadenas con inform es un rollo :shock:

Echale un vistazo al manual en profundidad, hay una rutina, quiza "Describir" ¿o quizá era otra? que sólo se ejecuta si el jugador está en la misma habitación que el objeto en cuestión, con lo que te ahorras el coñazo de los parents. El sitio lógico para poner esas frases es en cada objeto-PSI si tienes problema con las clases, así­ te ahorras otro posible problema, y total, para dos PSIs... :roll:

suerte


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 19 Oct 2004 20:03 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5308
Ubicación: Coruña
Lenko escribió:
Lo más cerca que he estado es haciendo la función "decir" tenga un número variable de parámetros. El problema es que no hay forma de que diferencie un parámetro que contenga un string de un número porque la variable del string contiene su dirección que es un número.


Yo no tengo ni idea de Inform; pero como te veo muy desesperado voy a intentar darte una solución para eso que yo creo que deberí­a funcionar en cualquier lenguaje con funciones o parámetros; aunque sea muy cutre.

Haz que los parámetros de la función "decir" sean siempre un número par, y que los impares te digan el formato de los pares. Es decir, las llamadas a decir serí­an de la forma

decir ( formato1 , dato1 , formato2 , dato2 , ... , formatoN, datoN )

donde formatoI te indica si datoI es un entero o un string, para cada I.

Así­, luego harí­as:

if ( primer parámetro = 0 )
tratar segundo parámetro como entero;
else if ( primer parámetro = 1 )
tratarlo como string;

Y lo mismo para el tercer y cuarto parámetros, y así­ sucesivamente.

Y por lo tanto a la función decir le pasarí­as algo como:

decir ( 1 , "tengo " , 0 , 4 , 1 , " monedas de oro y " , 0 , 7 , 1 , " monedas de cobre." );

Ya digo, es cutre; pero deberí­a funcionar, ¿no?

_________________
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:
NotaPublicado: 19 Oct 2004 23:09 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 09 Sep 2004 12:53
Mensajes: 1145
Gracias a los dos por contestar. Ya pensaba que clamaba en el desierto :)

dhan, me explico mejor para que veas por qué tanto rollo. En un principio estaba haciendo una prueba para la aventura que voy a empezar con belky. Estaba tratando de programar uno de los puzzles para ir soltándome, pero a medida que iba complicando la cosa me dije que mejor hacer las cosas bien y empezar a crear las clases que vamos a necesitar.

En principio el juego tiene unos 25 PSI's así­ que es un tema importante. Es más, el juego está basado en la interacción con los PSI's y se deben pasar la partida diciendo cosas en respuesta a tus acciones.

Querí­a crear una serie de funciones genéricas parar decir, gritar, cantar y un par de cosas más que harán. Cada una funciona de una forma un poco diferente. Por ejemplo gritar se oye en toda la aventura y decir sólo si está en la habitación del jugador. Las funciones se llaman continuamente y desde muchos puntos (otros objetos, daemons, ...) por eso no pueden ir en el describir, ni en el cada_turno (que es el que se activa cuando está el jugador).

Estaba muy contento de cómo funcionaba hasta que me encontré que tení­a que pasar un número y algún modificador :(

No te creas que ha sido por documentación, hoy me he estado mirando el manual, la Inform Beginer Guide y los FAQ de las páginas de la IBG donde leí­ que nanaidelachina a trabajar con las cadenas (también leí­ en la página del Inform que no piensa meter nada de manipulación de cadenas en la siguiente versión).

Intenté distinguir el tipo con las metaclases hasta que me di cuenta de que la cadena, una vez la pasas, se convierte en un número (dirección) indistinguible de otro normal y que los números no tienen metaclase.

La idea de Al-Khwarizmi no se me habí­a ocurrido (y mira que habí­a pensado cosas más complicadas) pero creo que me servirá ya que le podré indicar cómo quiero que se trate el dato, si como cadena, número o número en letras que básicamente es lo que necesito.

Una vez más gracias.

[EDITADO]
Ya he implementado el método alkhwarizmiano usando unas constantes cortitas y suponiendo que el primer parámetro siempre es un string para simplificar la mayorí­a de los mensajes que sólo contienen o empiezar por un string. Ha quedado justo como yo querí­a y no se ve demasiado feo.
Código:
Pirata.decir("Espera un momento que apunto esto.");
Pirata.realizar("saca una tiza y dibuja un ", PNJ_NUM, self.cantidad, PNJ_CAD, " en el suelo");

_________________
- Lenko -


Arriba
 Perfil  
 
Mostrar mensajes previos:  Ordenar por  
Nuevo tema Responder al tema  [ 5 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