Herramientas de usuario

Herramientas del sitio


eventos

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Próxima revisión
Revisión previa
Última revisión Ambos lados, revisión siguiente
eventos [2016/07/01 19:24]
al-khwarizmi creado
eventos [2016/07/01 20:09]
al-khwarizmi
Línea 1: Línea 1:
 ==== Eventos ==== ==== Eventos ====
  
-Para simular un mundo realmente dinámico, es importante conseguir que las entidades del mundo puedan reaccionar automáticamente ante los sucesos que ocurren en su entorno. Por ejemplo, nos puede interesar que un hombre nos salude al entrar en su jardín, que un puente se derrumbe al pasar por él, que una capa nos haga invisibles si nos la ponemos, que un gnomo se enfade si cogemos ​su sombrero, o que un personaje nos responda cuando le hablamos. ​Si bien muchas ​de estas cosas se pueden conseguir con un manejo cuidadoso de las propiedades y [[Propiedades y relaciones#​Temporización y método update|el método update]], sobre todo en conjunción con el manejo ​de los [[Estados de las criaturas#​Programación con estados|estados de las criaturas+Para simular un mundo realmente dinámico, es importante conseguir que las entidades del mundo puedan reaccionar automáticamente ante los sucesos que ocurren en su entorno. Por ejemplo, nos puede interesar que un hombre nos salude al entrar en su jardín, que un puente se derrumbe al pasar por él, que una capa vuelva invisible al personaje que se la pone, que un gnomo se enfade si le roban su sombrero, o que un personaje nos responda cuando le hablamos. ​Muchas ​de estas cosas se pueden conseguir con un manejo cuidadoso de las propiedades y [[Propiedades y relaciones#​Temporización y método update|el método update]], sobre todo en conjunción con la gestión ​de los [[Estados de las criaturas#​Programación con estados|estados de las criaturas]]. Sin embargo, si bien esta forma de hacer las cosas es muy potente, puede resultar incómoda, sobre todo si necesitamos gestionar muchas posibles reacciones. Por ello, AGE proporciona un mecanismo específico,​ más sencillo, para que los distintos componentes del mundo puedan reaccionar a sucesos, o //​eventos//,​ que ocurren en él. Para ello, el programador sólo tiene que definir en sus entidades los llamados //métodos de captura de eventos//, que son métodos que AGE ejecuta automáticamente cuando sucede un evento dado.
  
 +Conviene aclarar que, a lo largo de esta sección y el resto de la documentación,​ se utilizará la palabra "​evento"​ con dos sentidos diferentes: por un lado, el evento propiamente dicho (un suceso que desencadena una reacción), y por otro, el método de captura del evento (el método que ejecuta AGE, permitiendo al programador definir dicha reacción).
  
-http://​www.caad.es/​aetheria/​doc/​doku.php?​id=estados_de_las_criaturas#​programacion_con_estados+=== Métodos de captura de eventos ===
  
 +Como acabamos de anticipar, el método de captura de un evento (que, para abreviar, también llamaremos //evento// a secas) es un método que AGE ejecuta automáticamente cuando ocurre en el mundo un suceso determinado. Normalmente,​ un evento se define en una entidad dada y se ejecuta como reacción a algo que sucede en el entorno de esa entidad. ​
  
- En las secciones anteriores de la documentaciónhemos visto algún caso particular y limitado ​en el que esto sucede: ​en la sección sobre [[Propiedades ​relaciones#​Temporización ​método update|el método update]] vimos cómo programar reacciones cuando ​el temporizador ​de una propiedad llega a cero y hay que actualizarla, y en la sección de [[Combate y armas#​Entrando ​en combate|combate]] vimos cómo hacer que una criatura entre en combate automáticamente con sus enemigos. Sin embargo, para +Por ejemplo, en una habitación podemos definir un evento ​que se active cuando una criatura entre en dicha habitación. Para ello, podemos ir a la pestaña "​Código ​propiedades"​ de dicha habitación,​ agrandar el campo de código ​y, en el menú contextual (botón derecho), seleccionar "​Insertar código - Definir eventos de habitación"​. Al hacer esto, veremos en el menú desplegable los distintos eventos ​de habitación ​que están disponibles, y podremos seleccionar el que nos interesa, ​en este caso "Al entrar ​en la habitación", ​que nos genera ​una plantilla como sigue:
  
-Con el material tratado ​en las secciones anteriores de la documentación podemos hacer que las criaturas, cosas y habitaciones de nuestro mundo reaccionen de diversas maneras tanto ante [[Manipulación básica de entidades#​Método de análisis de la entrada referida a una entidad|la entrada introducida por un jugador]] como ante [[Propiedades y relaciones#​Temporización y método update|la actualización de una propiedad]]. Sin embargo, si queremos simular un mundo realmente dinámico, es importante conseguir que las entidades del mundo puedan reaccionar automáticamente ante los sucesos que ocurren en él+<code java> 
 +/* 
 +Método que captura ​el evento lanzado cuando una criatura entra en una habitación. 
 +*/ 
 +void onEnterRoom ( Mobile aCreature ) 
 +{
  
-Con el material tratado ​en los capítulos anteriores ​de la documentación podemos conseguir ​un mundo dinámico donde las criaturas y objetos se muevan y actúen ​de  +    //​aCreature:​ criatura que entra en la habitación. 
 +    //self: habitación en la que entra (es decir, esta habitación). 
 + 
 +
 +</​code>​ 
 + 
 +Tal y como explican los comentarios de la plantilla, el método (que llamamos evento ''​onEnterRoom''​) sólo recibe un parámetro: un ''​Mobile''​ que representa la criatura que ha entrado en la habitación. Así, cada vez que alguien entre, AGE va a ejecutar automáticamente el evento, pasándonos como parámetro el personaje que ha entrado por si necesitamos hacer algo con él (como hacerle caer en una trampa). Por supuesto, somos libres de no utilizar el parámetro si no queremos interactuar con la criatura en cuestión (tal vez queremos que cuando alguien entre en la habitación suceda algo que no involucre directamente a ese personaje, como que suene una alarma). 
 + 
 +A modo de ejemplo, supongamos que nuestra habitación es una tienda de alfombras, atendida en todo momento por Manolo, el esforzado tendero, que tiene como nombre único "​manolo"​. Podemos hacer que nos salude y nos ofrezca su selecta mercancía cada vez que entremos, de la siguiente manera: 
 + 
 +<code java> 
 +/* 
 +Método que captura el evento lanzado cuando una criatura entra en una habitación. 
 +*/ 
 +void onEnterRoom ( Mobile aCreature ) 
 +
 + 
 +    //​aCreature:​ criatura que entra en la habitación. 
 +    //self: habitación en la que entra (es decir, esta habitación). 
 +    mobile("​manolo"​).say("​¡Bienvenido,​ oh, potencial cliente!"​);​  
 +    mobile("​manolo"​).say("​Tengo las mejores alfombras al oeste del Pecos, a unos precios de escándalo."​);​ 
 + 
 +
 +</​code>​ 
 + 
 +Con este código, ​el tendero dará su saludo a cualquier personaje o criatura que entre en la tienda. Nótese que sólo tiene sentido si Manolo está siempre en su tienda: si puede estar en otro sitio, tendríamos que comprobar primero que realmente está presente: 
 + 
 +<code java> 
 +/* 
 +Método que captura el evento lanzado cuando una criatura entra en una habitación. 
 +*/ 
 +void onEnterRoom ( Mobile aCreature ) 
 +
 + 
 +    //​aCreature:​ criatura que entra en la habitación. 
 +    //self: habitación en la que entra (es decir, esta habitación). 
 +    Mobile tendero = mobile("​manolo"​);​ 
 +    if ( self.hasMobile( tendero ) ) 
 +    { 
 +        tendero.say("​¡Bienvenido,​ oh, potencial cliente!"​);​  
 +        tendero.say("​Tengo las mejores alfombras al oeste del Pecos, a unos precios ​de escándalo."​);​ 
 +    } 
 + 
 +
 +</​code>​ 
 + 
 +Si bien en este ejemplo no se utiliza el parámetro de entrada del método, puede haber ocasiones en las que sea necesario. Por ejemplo, imaginemos que a Manolo no le gustan los perros, y no los admite en su tienda. Entonces, su reacción tendrá que ser diferente según si la criatura que entra es un ser humano o un perro. Suponiendo que en nuestra aventura tenemos una propiedad "​esperro"​ que identifica a los perros, podríamos hacer algo como lo siguiente:​ 
 + 
 +<code java> 
 +/* 
 +Método que captura el evento lanzado cuando una criatura entra en una habitación. 
 +*/ 
 +void onEnterRoom ( Mobile aCreature ) 
 +
 + 
 +    //​aCreature:​ criatura que entra en la habitación. 
 +    //self: habitación en la que entra (es decir, esta habitación). 
 +    Mobile tendero = mobile("​manolo"​);​ 
 +    if ( self.hasMobile( tendero ) ) 
 +    { 
 +        if ( get( aCreature,"​esPerro"​ ) ) 
 +        { 
 +            tendero.say("​¡Vade retro, sucio cánido! Los de tu especie no son bienvenidos aquí."​);​ 
 +        } 
 +        else 
 +        { 
 +            tendero.say("​¡Bienvenido,​ oh, potencial cliente!"​);​  
 +            tendero.say("​Tengo ​las mejores alfombras al oeste del Pecos, a unos precios de escándalo."​);​ 
 +        } 
 +    } 
 + 
 +
 +</​code>​ 
 + 
 +De la misma manera que reaccionamos a la entrada de una criatura en una habitación,​ existen otros eventos que podemos definir tanto en habitaciones como en criaturas y cosas para reaccionar ante otros muchos sucesos que pueden producirse en el mundo. Puedes ver una lista de eventos, con una breve explicación de cómo se utiliza, en (... continuará ...)
eventos.txt · Última modificación: 2016/07/01 23:45 por al-khwarizmi