Tema 10

HAGASE LA LUZ -COMUNICACIÓN ENTRE PRIMS (Uso del evento Listen)

 Este tema se lo dedico especialmente al scripter Woolich Ulich, mi gran maestro, que nos dio unas entrañables clases durante el otoño de 2007.

 Siguiendo con el espíritu de ejemplos prácticos de este curso, esta vez vamos a hacer una lámpara de techo que será accionada por un interruptor colocado en una pared. De paso, repasaremos los conceptos de privacidad del tema 8 (el del chat) mientras aprenderemos de que forma se comunican los prims entre ellos, y para qué es necesario que se hablen.

 Empecemos construyendo con prims. No es necesario que sean muy perfectos, pues lo que nos importa son los scripts que llevan dentro. De todas formas para los que así lo queráis os indico a continuación qué prims necesitaremos.

1-La habitación: Soporte en el que colocaremos la lámpara y el interruptor. Hacer un gran cubo y darle a la casilla “Vacia” 95.0. Después girarlo y aumentarlo, hasta que haga las veces de pared y techo.
2-El interruptor: A partir de un cubo, hacer un pequeño rectángulo y ponerlo sobre la pared, a la altura de la mano de un avatar.
3-Una lámpara. De momento solo una, ya que antes de duplicarla, haremos el script en ella para que todas sus copias contengan ya ese script automáticamente. Ver siguiente imagen

10-1

La bombilla es un Relieve o Torus con las medidas x 3.20 y 3.20 z 3.20 e “Inicio y fin del corte de Perfil-casilla E”  en 0.650.
El brazo de la bombilla es otro relieve con las medidas x 0.13 y 0.80 z 1.30,
con la casilla “Camino de principio a fin- B” en 0.35
y la casilla “Tamaño del agujero-Y” en 0.15.

 Es importante que el script de la bombilla lo contenga solo esta y no el brazo de la lámpara, así que no hace falta que las linkemos. Pero si queréis podéis crear un script dentro de la pestaña “Contenido” de la bombilla , y linkearla  teniendo cuidado de que el prim padre (el perfilado en amarillo) sea la bombilla y no el brazo. Ver siguiente imagen. De esta forma trabajaremos con un brazo de la lámpara (2) y el interruptor (3)

10-2

 Ya tenemos listos los prims que vamos a utilizar. Ahora vamos a comenzar el trabajo…

 El interruptor hace de “jefe”, es el que da órdenes a las bombillas . Para ello le basta con decir por el chat “una palabra o palabras clave” que las bombillas puedan detectar.
Entonces nos bastará introducir en él un script con dos estados. Uno para encenderlas y otro para apagarlas.De momento usaremos el canal 0 (el público). En la siguiente imagen, reconoceréis la forma de este script de otros temas de este curso.

10-3110-3

 Ahora vamos a trabajar en el script de la bombilla. Necesitamos dos colores para diferenciar cuando la bombilla está apagada y cuando encendida, así que al inicio del script declararemos dos variables de tipo Vector para almacenar dichos colores. Yo he elegido <1.0,1.0,0.4> para encendido, y <0.6,0.6,0.4> para apagado.

 A continuación vamos a ver como se utiliza llListen (Escuchar, en ingles).

listen( integer channel, string name, key id, string message )

 llListen es un Evento que nos sirve para cribar información de chat. Sólo hay que indicarle cualquiera de los cuatro parámetros (o todos ellos) que queramos que tenga en cuenta para desencadenar unas órdenes. Estos parámetros son…

 integer channel : El canal de chat al que tiene que atender. (recordar que son millones)
 string name : El nombre del Prim, Objeto o Avatar que tiene que escuchar
 key id : La key o clave del Prim, Objeto o Avatar que tiene que escuchar
 string message : la “palabra o frase clave” que ha de esperar oír para activarse.

 Para usar correctamente este evento, hay que anunciárselo al script antes. Sería como decirle… “Por favor, atiende por el canal tal a fulanito a ver si dice tal cosa.” J
Esto en nuestro caso seria así:
  LlListen(0, “Interruptor” , NULL_KEY, “ ”);
Es decir que escuche por el canal 0 al objeto llamado Interruptor, su key no nos importa en este caso (NULL_KEY) y el mensaje no nos importa “ “ . Diga lo que diga escucha al interruptor. Esta línea ha de ir en state_entry, para que “comience a oir”.
Ver cómo,en la siguiente imagen:

10-4110-4

 Después inicializamos el evento listen

listen (integer channel, string name, key id, string message)
{
   Y ponemos aquí que es lo que queremos que haga el script cuando se cumplan las
“condiciones de criba”  que especificamos en la llamada anterior.
}

 Para este ejercicio vamos a comparar si mensaje que dijo Interruptor es “APAGATE” o “ENCIENDETE” que son los que “interesan” a la bombilla. De este modo, utilizamos un bucle if del siguiente modo:

    if ( message = = “ENCIENDETE”) no vale message = “ENCIENDETE”
   {
   Ponemos el prim del color que almacenamos para la bombilla encendida en encencido
      llSetColor ( encendido, ALL_SIDES);
   Y cambiamos la luminosidad del prim tal como se hace en el Menú de Edicion, 
    pestaña Textura, casilla Brillo; pero con la función llSetPrimitiveParams() que aún 
   no   habíamos visto en este curso de este modo
      llSetPrimitiveParams( [PRIM_FULLBRIGHT, ALL_SIDES, TRUE]);
   }
  En el caso de que el mensaje no sea “ENCIENDETE” (Pues nuestro interruptor solo sabe decir dos cosas, jajaja). cambiamos el color y el brillo de nuevo asi:
   else
   {
      llSetColor ( apagado, ALL_SIDES);
      llSetPrimitiveParams( [PRIM_FULLBRIGHT, ALL_SIDES, FALSE]);
   }

No nos vamos a detener en este tema a analizar la función llSetPrimitiveParams(). Pero saber que mediante ella podemos modificar cualquier cosa del Menu Edición durante el transcurso de un script. En nuestro caso el Brillo (PRIM_FULLBRIGHT). Los otros dos parámetros son el ya conocido ALL_SIDES y TRUE (Verdadero en inglés). Después lo cambiamos por FALSE para apagar nuestra bombilla.

 Para el que sepa inglés y se quiera documentar sobre esta función:
http://www.lslwiki.net/lslwiki/wakka.php?wakka=llSetPrimitiveParams

 Una vez hecho esto ya funcionaría nuestra instalación eléctrica. Si un avatar toca el interruptor, las luces se encenderán y apagarán alternativamente. Pero… Y si queremos que solo nuestro avatar pueda encender y apagar  las luces…
  En el script del interruptor dejamos que este haga caso a todos los avatares que lo toquen, si no deseamos que sea así hay que poner una coondición en su script. Podemos hacer que el interruptor nos reconozca mediante el nombre del avatar, o mediante la key. En la siguiente imagen lo hemos hecho con el nombre

Antes de default vamos a declarar dos variables del tipo string . una con el nombre de su amo, y otra para almacenar el nombre de quien pulsó para poderlo comparar con el primero.
 
10-5110-5

 La función llDetectedName(0); dentro de touch_start , recoge el nombre del avatar que hizo “Touch” y lo almacena en la variable “pulsante” mediante un solo signo =.
Ahora sólo permitiremos que se encienda la luz si el pulsante es el mismo amo. Con un bucle de tipo if . La coondición es que (pulsante= = amo), lleva dos signos = porque sino asigna el nombre del que pulsó a la variable amo y en este caso queremos comprobar , no asignar. Lo demás ya lo sabéis. ;J Un mensajito para los que toquen sin permiso en else, y todo el proceso calcado para el estado state encendido.

 Ahora vamos a hacer lo mismo pero mediante la key, del avatar que pulsa.
 En el Tema 8 vimos como obtener la key o clave de nuestro avatar. La pelota que nos decía nuesta clave en el canal del owner. La recogemos y la escribimos tal cual entre comillas , en una variable key antes de default. Creamos ahí también otra variable key para almacenar la key del avatar pulsante.
El resto es ya muy fácil de comprender. Realizamos una comparación como en el caso anterior, pero esta vez de claves.
El script quedaría  como podéis obserbar en la siguiente imagen:

10-6110-6

Por último, una cosita más. Puede que no querais que lo que dice el interruptor salga por el chat público. Así que antes de multiplicar nuestro brazo de lámpara, cambiaremos en los dos scripts todo lo referente al canal.

En el script del interruptor el 0 de los llSay(); por cualquier número (dejar en el canal 0 los que dicen “No me toques”J)
Y en el script de la bombilla, en la línea de preparación LlListen(0, “Interruptor” , NULL_KEY, “ ”); ese otro 0 por el mismo canal que elegimos antes
Ahora si podemos linkar lar bombilla con su brazo, y sacarle al objeto tantas copias como queramos.

10-7

  Con esto es suficiente por hoy. Apagar el Sol de Sl y disfrutar de la obra del electricista.

Fritxitin Martinek 20 de abril de 2008

One response

21 02 2012
Jesús

Carai!!!
Casi cuatro años de este post y 5 de aquellos cursos de scripting…
Despues de tanto tiempo es agradable encontrarse cosas como estas por la red.

Un abrazo donde quiera que estés Fritxitin…

Woolich

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s




A %d blogueros les gusta esto: