CAAD

Comunidad de Aventuras Conversacionales y Relatos Interactivos
Fecha actual 09 Ago 2020 15:21

Todos los horarios son UTC + 1 hora




Nuevo tema Responder al tema  [ 10 mensajes ] 
Autor Mensaje
NotaPublicado: 16 Mar 2010 16:34 
Desconectado
xyzzy

Registrado: 09 Mar 2004 22:50
Mensajes: 9150
Creo que ya es hora de volver al tema de los generic.

No sé si recordarás aquel hilo en el que intentaste que entendiera cómo funcionaban, sin mucho éxito.

El código en cuestión era el que sigue:
Para la blusa:
Código:
void parseCommandGeneric ( Mobile aCreature , String verb , String args1 , String args2, Entity obj1 , Entity obj2 , boolean goesFirst )
{
               if(equals(verb,"poner") && (equals(obj2,item("cofre"))))
                 {
                aCreature.write("Has metido la blusa en el cofre. Acto seguido mueves la palanca,     hacerlo la tapa cae cerrando el cofre. \n ");
                world.getAbstractEntity("guion").setProperty("guardar_blusa", true,0);
                }
}


Para el cofre:
Código:
void parseCommandGeneric ( Mobile aCreature , String verb , String args1 , String args2, Entity obj1 , Entity obj2 , boolean goesFirst )
{
         aCreature.write("\n desde el objeto cofre closed is " + self.getPropertyValueAsBoolean("closed") + "\n");
}


El resutaldo era éste:
Código:
Tu orden:  mete blusa en cofre
Desde el objeto blusa el verbo es: poner
Desde el objeto blusa el  primer objeto [ eu.irreality.age.Item:30000000:la blusa ]
Desde el objeto blusa el  objeto dos [ eu.irreality.age.Item:30000001:el cofre ]
Desde el objeto blusa dices, Has metido la blusa en el cofre
Acto seguido mueves la palanca, al hacerlo la tapa cae cerrando el cofre.

desde el objeto cofre closed is false

desde el objeto cofre closed is false
Pones la blusa en el cofre.


Y el problema a mi parecer, era que la segunda frase se repetía dos veces.
Tú me dijiste que era un mal manejo de los parseCommands y que lo estaba haciendo mal, intentaste explicármelo, pero yo no me enteré de nada.
Por eso te pido que hagas las correcciones oportunas en ese mismo código y me las muestres para ver si así termino de entender cómo funciona los de los generic.


Arriba
 Perfil  
 
NotaPublicado: 16 Mar 2010 16:45 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5312
Ubicación: Coruña
Bueno, primero tengo que acordarme de qué querías exactamente.

¿Lo que quieres es que cuando pones la blusa en el cofre (y sólo la blusa en el cofre, no otra cosa en el cofre, ni la blusa en otra parte), se ejecuten los dos parseCommandGeneric, y que cada uno de ellos sólo se ejecute una vez?

_________________
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: 16 Mar 2010 17:04 
Desconectado
xyzzy

Registrado: 09 Mar 2004 22:50
Mensajes: 9150
Al-Khwarizmi escribió:
Bueno, primero tengo que acordarme de qué querías exactamente.

¿Lo que quieres es que cuando pones la blusa en el cofre (y sólo la blusa en el cofre, no otra cosa en el cofre, ni la blusa en otra parte), se ejecuten los dos parseCommandGeneric, y que cada uno de ellos sólo se ejecute una vez?


Realmente lo que quiero es usar un parseCommand b4 para todo, se use un objeto o dos, sean o no contenedores. De este modo me aseguro estar usando siempre el parser correcto, pero antes tengo que aprenderme sus manías.
Así que voy a intentar aprender a base de ejemplos.
Lo del null más o menos lo tengo claro, en cualquier comparación he de tener cuidado con que lo que se compara no sea null, así que es mejor comparar el obj1 con el obj2, porque sabemos que siempre hay al menos un obj1 y así con lo demás.

Pero en este tema del cofre y la blusa me perdí por completo.
¿Cómo habría tenido que hacerlo aquí para que el write del cofre no se imprimiera dos veces?


Arriba
 Perfil  
 
NotaPublicado: 16 Mar 2010 17:12 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5312
Ubicación: Coruña
Pues con esto no se debería imprimir dos veces:

Código:
void parseCommandGeneric ( Mobile aCreature , String verb , String args1 , String args2, Entity obj1 , Entity obj2 , boolean goesFirst )
{
  if ( equals(obj1,item("blusa")) && equals(obj2,self) )
  {
      aCreature.write("\n desde el objeto cofre closed is " + self.getPropertyValueAsBoolean("closed") + "\n");
  }     
}


Es simplemente cosa de comprobar que todos los objetos que te pasa el parseCommand son los que quieres, ya que el parseCommandGeneric es tan genérico que vale tanto para un objeto como para dos.

_________________
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: 16 Mar 2010 17:20 
Desconectado
xyzzy

Registrado: 09 Mar 2004 22:50
Mensajes: 9150
Al-Khwarizmi escribió:
Pues con esto no se debería imprimir dos veces:

Código:
void parseCommandGeneric ( Mobile aCreature , String verb , String args1 , String args2, Entity obj1 , Entity obj2 , boolean goesFirst )
{
  if ( equals(obj1,item("blusa")) && equals(obj2,self) )
  {
      aCreature.write("\n desde el objeto cofre closed is " + self.getPropertyValueAsBoolean("closed") + "\n");
  }     
}


Es simplemente cosa de comprobar que todos los objetos que te pasa el parseCommand son los que quieres, ya que el parseCommandGeneric es tan genérico que vale tanto para un objeto como para dos.



Vale, ya lo he pillado... benditos ejemplos.

El problema es que el parserCommand del cofre no tiene condición, se imprime siempre que se nombra al cofre por algún lado ¿no?
Por un momento pensé que por cualquier referencia a un objeto desde otro iba a tener que crear una réplica en ambos... pero no, porque lo normal es que cada parseComman tenga sus propias condiciones, el problema aquí era que en el del cofre había puesto ese write para comprobar el valor closed del cofre y se imprime por el simple hecho de nombrarse en otro objeto con ese mismo tipo de parser.

No sé si me he explicado bien, pero creo que estoy en lo cierto.


Arriba
 Perfil  
 
NotaPublicado: 16 Mar 2010 17:25 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5312
Ubicación: Coruña
Sí, la idea es que el parseCommand genérico es como un "todo en uno", efectivamente, se ejecuta siempre que el cofre esté por alguna parte. Por eso requiere más comprobaciones que los otros.

Cuando usas por ejemplo un parseCommandTwoObjects, ya se supone que quieres capturar una acción sobre dos objetos, por lo tanto, ya se sabe que va a haber dos objetos y no tienes que comprobar que los hay.

Pero cuando usas un parseCommandGeneric, el AGE no sabe si quieres capturar una acción con dos objetos o con uno o con cualquier cosa (ya que vale para todos), así que te puede pasar dos o uno (¡y además en cualquier orden!) y por lo tanto no tienes más remedio que comprobar qué te está viniendo como parámetro si quieres que sólo actúe cuando te pasan dos objetos, en este caso el cofre y la blusa.

_________________
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: 16 Mar 2010 17:36 
Desconectado
xyzzy

Registrado: 09 Mar 2004 22:50
Mensajes: 9150
Que alivio.

Pues es que pienso que a la larga lo mejor es usar siempre el b4, o como mucho el b4 para los contenedores y el a4 para los que no lo son.
Siempre que haya más de un objeto, el jugador puede intentar usar uno con otro, y lo mejor es que el parseCommand esté listo para ello.


Arriba
 Perfil  
 
NotaPublicado: 16 Mar 2010 17:39 
Desconectado
Semimomio
Semimomio
Avatar de Usuario

Registrado: 24 Ago 2007 00:41
Mensajes: 2023
Ubicación: Chile
Ah joder! :cry: GENERICS!!! :!: :? :? :? :?

http://instantchan.com/

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


Arriba
 Perfil  
 
NotaPublicado: 16 Mar 2010 17:41 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5312
Ubicación: Coruña
Bueno, yo personalmente prefiero usar mayoritariamente los más específicos, porque así tienes en métodos separados los comportamientos según sean con un objeto solo, con dos en orden, con dos en cualquier orden, etc; en lugar de tenerlo todo en un solo método.

Pero esto es muy subjetivo y puramente cuestión de gustos, y por eso he puesto todas las opciones, para que cada cual use las que le sean más cómodas en cada momento :)

_________________
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: 16 Mar 2010 17:41 
Desconectado
Samudio
Samudio
Avatar de Usuario

Registrado: 09 Mar 2004 16:16
Mensajes: 5312
Ubicación: Coruña
Eliuk Blau escribió:
Ah joder! :cry: GENERICS!!! :!: :? :? :? :?


jajaja... no son generics, son métodos parseCommandGeneric.

_________________
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  [ 10 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 3 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