miércoles, 7 de mayo de 2008

Script: Puerta doble, corredera

En este ejemplo nos serviremos de:

Estados
Eventos de estado

Los eventos de estados que usaremos son:

state_entry: lo primero que hace al entrar en un estado
collision_start: cuando un objeto colisiona con otro objeto
timer: cuando transcurre cierta unidad de tiempo



Todos los objetos tienen un estado por defecto, en este caso, además le hemos definido un evento.

Como son dos puertas necesitamos realizar este script en las dos (cambiando algunas cosas).

default

{

state_entry()

{

llSetPos(llGetPos()-<1,0,0>);

state a;

}



}



Con llGetPos() obtenemos el vector con las coordenadas x,y,z del objeto dentro de la isla. Las
unidades están en metros.

En este caso usamos una doble puerta de 1 metro de ancho cada una.

Es importante que la puerta esté en posición de cerrado inicialmente (Antes de escribir este script).

llSetPos establece las coordenadas x,y,z del objeto dentro de la isla.

El estado default, una vez que se salga de él no se vuele a entrar en él. (a no ser que reescribamos el script) ya que se salta del estado 'default' al 'a', del 'a' al 'b', del 'b' al 'a', manteniendo así una ciclicidad entre los estados 'a' y 'b'.

En default lo que hacemos es abrir la puerta ya que al entrar en el estado 'a', este estado
sirve para cerrar y como ya está cerrada lo hacemos es compensarlo sumándole <1,0,0>.

En este caso el movimiento de la puerta será en el eje x, ya que nos cuadra así, pero podría serlo en el y, z.

//cerrar

state a

{

state_entry()

{

llSetTimerEvent(0);

llSetPos(llGetPos()+<1,0,0>);

}



collision_start(integer a)

{

state b;

}

}



En este estado, como está state_entry, asumimos que la puerta está abierta y aplicamos un desplazamiento contrario en el eje x para cerrarla.

Con llSetTimerEvent(0) lo que hacemos es desactivar eventos de tiempo (Para el objeto, es decir para todos los estados). Esto se hace ya que nuestra puerta es automática, tras abrirse al pasar cierto tiempo vuelve a cerrarse automáticamente.

En este estado el objeto es sensible a colisiones con cualquier cosa que se mueva. Cuando un
objeto choque con la puerta esta saltará al estado "b" automáticamente.

//abrir

state b

{

state_entry()

{

llSetTimerEvent(3);

llSetPos(llGetPos()-<1,0,0>) ;

}



timer()

{

state a;

}



}

En este estado asumimos que la puerta está cerrada. Viendo el estado state_entry, lo primero que hacemos es activar los eventos de tiempo, que tendrán lugar cada 3 segundos, que es la unidad de tiempo con la que trabaja.

A continuación se aplica un desplazamiento a la puerta, de un metro, en el eje x, en el sentido de
abrir.

Como este estado es sensible a eventos de tiempo tras pasar n segundos, volverá al estado 'a', que es el de cerrar.

Para la otra puerta, como se abre en el otro sentido, será simétrico, y bastará con cambiar el '+' por el '-' y viceversa.



default

{

state_entry()

{

llSetPos(llGetPos()+<1,0,0>);

state a;

}





}



//cerrar

state a

{

state_entry()

{

llSetTimerEvent(0);

llSetPos(llGetPos()-<1,0,0>);

}



collision_start(integer a)

{

state b;

}

}



//abrir

state b

{

state_entry()

{

llSetTimerEvent(3);

llSetPos(llGetPos()+<1,0,0>) ;

}



timer()

{

state a;

}



}

No hay comentarios: