Herramientas de usuario

Herramientas del sitio


manejo_de_eventos

¡Esta es una revisión vieja del documento!


Manejo de 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 el método update, sobre todo en conjunción con la gestión de los 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).

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:

/*
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).
 
}

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:

/*
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.");
 
}

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:

/*
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.");
    }
 
}

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:

/*
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.");
        }
    }
 
}

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. Para utilizar un evento, sólo hay que saber su nombre, cuándo se ejecuta y qué parámetro o parámetros necesita (o simplemente buscarlo en el menú contextual de PUCK y mirar la plantilla). Puedes consultar la documentación de todos los eventos, con una breve explicación de cómo se utiliza cada uno, en la lista de eventos.

Sin embargo, un aspecto concreto que se puede implementar con eventos es lo suficientemente importante como para dedicarle su propio epígrafe: la implementación de conversaciones con personajes.

Conversaciones

Una particularidad muy característica de los juegos de texto es la posibilidad de que haya personajes en el mundo que conversen automáticamente con los jugadores. Esto se puede implementar de maneras muy diferentes, como pueden ser los menús o árboles de conversación, la conversación por temas seleccionables, o la conversación libre.

El sistema AGE está diseñado para dar soporte sencillo a la conversación libre. Si bien otros modos de conversación (como puede ser por menús) se pueden implementar, no se proporcionan herramientas para ellos por defecto, al menos por el momento, teniendo que programar los menús el creador de la aventura. Sin embargo, AGE sí que tiene un sistema pensado para facilitar la conversación libre. Dicho sistema funciona de la siguiente manera:

  • En cualquier momento, un jugador o personaje puede decir algo. En el caso de los jugadores, esto sucede normalmente como consecuencia de una orden: por defecto, si un jugador teclea “decir “hola”” el resultado será que su personaje dice “hola”. En el caso de los personajes no jugadores, podemos hacer que digan algo llamando a personaje.say(“hola”).
  • Cuando un personaje dice algo, se envía una notificación a la habitación que contiene el texto que ha dicho. Esto tiene como consecuencia que se muestra un mensaje a los personajes que estén allí, para informar de lo que ha pasado (por defecto, se mostrará Dices “hola”. si lo has dicho tú, o Fulanito dice “hola”., si es otro personaje el que ha hablado).

> decir “hola”
Dices “hola”.\\

  • El hecho de que alguien haya hablado en la habitación actual se puede capturar mediante un evento.
manejo_de_eventos.1467410527.txt.gz · Última modificación: 2016/07/02 00:02 por al-khwarizmi