Es Vida, Jim, Pero No Como la Conocemos |
En este tutorial, te mostraré cómo usar scripts en tus escenas. NO voy a enseñarte a programarlos. Eso viene después. De momento, supón que tienes un script que quieres usar. Te mostraré como enchufarlo en tu mundo para que puedas usarlo.
El Nodo Script
El nodo Script es probablemente el más importante de VRML97. Convierte un lenguaje de programación simple y estático (a pesar de las animaciones) en un universo casi infinito de posibilidades. Básicamente, el nodo Script permite construir tus propios nodos con sus propios campos, eventIns y eventOuts. La sintaxis del nodo Script es como sigue:
Script { exposedField MFString url [] field SFBool directOutput FALSE field SFBool mustEvaluate FALSE #También, tanto de lo siguiente como sea necesario: eventIn Type eventInName field Type fieldName default value eventOut Type eventOutName }
Así, todos los scripts tienen tres campos básicos en común. Los veremos en un momento. Así como éstos, también tienen cualquier número de campos definidos por el programador, eventIns y eventOut. Estos se definen de manera muy similar a como se hacía con PROTO. Se usa la palabra reservada field, eventIn o eventOut, según lo que quieras hacer, y el tipo de valor que acepta el campo (por ejemplo SFBool), y finalmente el nombre. En el caso de que sea un campo, y no un eventIn o un eventOut, debes especificar un valor para el campo. Un ejemplo de esto se muestra debajo:
Script { eventIn SFBool input field SFBool boolValue TRUE eventOut SFBool output url "filter.js" }
Esto especifica un campo de cada tipo para nuestro nodo script. Un eventIn llamado input, un eventOut llamado output, y un campo llamado boolValue con un valor predefinido de TRUE. También especifica que el código del script se encuentra en el archivo "filter.js."
Nota: los nodos Script no pueden tener exposedFields.
Los Lenguajes
Hay tres maneras de definir scripts en VRML. En primer lugar, puedes emplear código Java compilado, en un archivo .class referido con su ruta correspondiente en el campo url. Despues, puedes usar código JavaScript en un archivo externo con extensión .js, igual que antes. Y finalmente, puedes incluir directamente el código en el campo url. Un ejemplo de esto último se muestra debajo:
url "javascript: function input(value, time) { if (value==boolValue) output = value; } "
Un script escrito directamente se especifica usando en el nodo url "javascript:" seguido del código en ese mismo campo. Esto es bastante apropiado para cantidades pequeñas de código, o código que se usa una única vez por archivo, donde el tiempo empleado en transmitir la información del archivo extra no compensa por escribir un archivo VRML ligeramente mayor.
Lo que sí resulta un poco más complejo es la elección de lenguaje de programación que vamos a emplear. JavaScript es un lenguaje muy simple que se aprende con facilidad, con un procesamiento simple de eventos y buena integración con VRML. Si embargo, le falta el poder y la flexibilidad de Java. Por este motivo, JavaScript es muy apropiado para scripts simples y pequeños como interruptores, filtros, y este tipo de empleos. Java es más apropiado para el trabajo duro, operaciones matemáticas complejas, o relacción con el hardware. Además, al estar compilado en bytecode, aporta la ventaja de que otras personas no pueden ver el funcionamiento interno de tu programa. Si quisieras proteger tu código VRML para que no pudiese ser visto o manipulado por otra persona, lo más apropiado sería que usases Java para generar el resto del código.
Conectándolo todo.
Una vez que hayas realizado tu script, puedes conectarlo donde desees dentro de la cadena de eventos. Procesarán los eventos que le envies y enviarán los eventos a los campos a los que los hayas dirigido, y los campos del nodo que has definido anteriormente influirán en su comportamiento interno. Quedan un par de cosas por cubrir antes de que sigamos y te dispongas a construir mecanismos complejos para tus mundos. Los dos campos que hemos ignorado anteriormente necesitan ahora ser cubiertos con detalle. El primero es el campo mustEvaluate. Dice al navegador que evalue los eventos que recibe el nodo Script tan rápido como le sea posible. De ese modo, si se están procesando muchos datos al mismo tiempo, puede saltarse la cola de eventos y evaluarlos todos de un sólo golpe, lo cual es mucho más eficiente. Generalmente, déjalo como FALSE, a menos que compruebes que se están realizando retrasos procesando los eventos del script, en cuyo caso debes ponerlo a TRUE para evitarlo. El campo directOutput permite a un Script saltarse la cadena de eventos y colocar los valores de sus campos directamente en los nodos a los que tiene acceso. Esto se verá con detalle en la cuarta parte.
No Como La Conocemos, Capitán.
¡Muy bien, entonces!. Echa un ojillo a este ejemplo, junto con el código. Es igual que el último, pero esta vez se usa un script para filtrar los mensajes del isActive de modo que sólo los eventos evaluados TRUE terminen. Esto nos permite enviar un set_bind permanentemente a un nodo. Verás que puedes pulsar el botón del ratón y al soltarlo los cambios permanecerán hasta que vualvas a pulsarlo sobre otro. El Script toma los eventos isActive que recibe, y los compara con el valor de su boolValue, y solo permite pasar a aquellos cuyo valor coincida con este (Esto es, que sean TRUE).
Vale, el próximo capítulo vamos a usar el nodo Switch, y después explicaré cómo realizar tus propios scripts.