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

Ambos lados, revisión anterior Revisión previa
eventos [2016/07/01 20:09]
al-khwarizmi
eventos [2016/07/01 23:45] (actual)
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 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. +Aquí irá la lista de eventos (por hacer).
- +
-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). +
- +
-=== 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.  +
- +
-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 y 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: +
- +
-<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). +
- +
-+
-</​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