Agárrate el sombrero

Así que, ya sabes como crear scripts en ECMAScript, y ya tienes bastante idea sobre como funciona todo esto del scripting. Pero quieres mas potencia! El ECMAScript es demasiado lento, demasiado restrictivo, demasiado difícil de usar con grandes programas. Bien, la ayuda esta en camino, porque el VRML no solo permite el ECMAScript en los nodos de script, también soporta el Java! Y yo voy a enseñarte como se utiliza, ¿no eres un tío con suerte?. En primer lugar, sin embargo, tengo que advertirte un par de cosas...

ADVERTENCIA PARA LA SALUD PUBLICA #1: ¡Java es un lenguaje de programación completo(full-blown)! Mientras que hemos ido viendo casi todo lo que el ECMAScript podía hacer antes de aprender nada sobre scripts VRML, no hay manera de que se pueda hacer esto con Java. Es sencillamente demasiado grande. Levaría un tutorial entero más grande que este el darte una base medianamente sólida de Java, el cual no tengo ni tiempo ni espacio para poder escribir. ¡Después de todo, esto se supone que es un tutorial de VRML! Por esta razón, esta parte del tutorial va a omitir un gran numero de detalles sobre el lenguaje Java. Todo ira bien a pesar de eso, encontraras que la sintaxis es bastante parecida a la del ECMAScript, de manera que serás capaz de seguir lo que esta ocurriendo. Explicare cuales son las principales diferencias e intentare no dejarte totalmente perdido. Sin embargo, te recomiendo que, si vas a tomarte en serio lo de utilizar Java como Script, vayas a aprender el lenguaje a cualquier otro lugar al tiempo que lees estos tutoriales, ya que habrá un montón de cosas que yo me omitiré. Yo explicaré la mayoría de las cosas con pocas palabras, pero tu también deberías practicar y obtener un conocimiento mas profundo de el. Échale un vistazo a la dirección java.about.com como punto de partida para buscar información sobre Java (java.sun.com).

ADVERTENCIA PARA LA SALUD PUBLICA #2: ¡No todos los navegadores soportan Java! Desgraciadamente, esto incluye a Blaxxun, así que ten cuidado con la plataforma para la que estas desarrollando cuando estés escribiendo (sin embargo esto es siempre importante en VRML). Si quieres crear algo bueno para ColonyCity, no pierdas el tiempo leyéndote esto ni un momento. ¡Concéntrate en el ECMAScript únicamente!

En cualquier caso ya hay bastante de esto. Entremos en materia, ¿de acuerdo?, Como dice el titulo, agárrate el sombrero...

Pero, ¿Por qué?

Empecemos en primer lugar echando un vistazo a porque querríamos utilizar Java. ¿Es que no es el ECMAScript lo bastante bueno? Bueno, en una palabra, NO. No para proyectos grandes. Si lo que vas a hacer es alguna cosa muy simple como lo que ya hemos visto antes esta bien, pero si lo que quieres es conectar tu mundo VRMML directamente a un servidor central, o a una base de datos, o aun motor de IA para tu juego, eso no va a suceder con ECMAScript. Java proporciona la estructura necesaria para grandes proyectos, que es totalmente vital. En pocas palabras, si estas haciendo algo simple, el ECMAScript es estupendo (por eso esta ahí), pero para aplicaciones complejas, realmente necesitaras utilizar Java.

Conceptos básicos Java

De acuerdo, si vamos a estar escribiendo código Java, será mejor que veamos algunos conceptos sobre el lenguaje. Realmente escribir instrucciones en Java es muy parecido a hacerlo en ECMAScript, así que una vez que hayas visto algunos ejemplos ya debería bastarte. Sin embargo, esas instrucciones se ajustan entre ellas de una manera ligeramente distinta. Vamos a hablar durante unos minutos sobre clases, herencia, y un par de cosas más.

¿Recuerdas los objetos de cuando los vimos con ECMAScript? Eran como cajas que podían contener gran cantidad de bits de datos, y también podían contener métodos que manipulaban los datos contenidos en la caja (¿Recuerdas los pixies?). Ahora bien, en ECMAScript nunca creamos nuestros propios objetos, simplemente utilizamos los predefinidos en el VRML-97. En realidad no necesitábamos pensar en ellos. En Java, sin embargo, el objeto es el rey, y se le denomina clase. Java es el principal ejemplo de lenguaje de programación orientado a objetos, y todo lo que se escriba tiene que ser parte de una clase. Todas las funciones que se escriban serán métodos de una u otra clase, y todos los datos se guardaran en variables miembros (conocidas en Java como variables de instancia). En estos momentos esto suena innecesariamente complicado, pero cuando te encuentres creando una interface entre el VRML-97 y tu servidor de bases de datos, te sentirás agradecido.

El siguiente concepto a introducir es el concepto de herencia. Hay dos maneras de crear clases. Tres si se cuenta "out of paper and string", pero podrías tener dificultades utilizando esas en línea. La primera manera es crear tu propia clase de la nada. Empiezas con una clase vacía, no habrá nada en la clase excepto lo que tu hallas puesto ahí. El otro modo es utilizar la herencia. Esto supone coger una clase que ya exista (esta será tu clase base), y extenderla para añadir tu propia funcionalidad. Ahora bien, esto no es tan simple como editar el código de alguien, sino mas bien como añadirle algunos bits. Una clase derivada (la que hemos creado) contiene todas las variables de instancia y los métodos de la clase base, mas todo lo que la hallamos añadido. Si se cambia el comportamiento de la clase base, el comportamiento de la clase derivada cambiará de la misma manera. Veamos un ejemplo...

Vehiculo {
        Color;
        Conducir();
}
Bien, tenemos una clase base del tipo vehiculo. Esto no es Java, por el momento, no te excites aun. El vehiculo tiene una variable de instancia, color. También tiene un método, Conducir(). Ten en cuenta que ambas cosas so aplicables a cualquier cosa que pueda considerarse un vehiculo. Ahora, si utilizamos la herencia para crear un Coche y un Camion...
Coche extends Vehiculo {
        Num_puertas;
}
Camion extends Vehiculo {
        Descargar();
}

Queda una cosa mas sobre la que hablar, y son los modificadores de acceso. Suena acojonante, pero de nuevo no lo es. Cada variable o función de una clase tiene un modificador de acceso que indica quien o que está permitido usar. También tengo que dar una pequeña introducción sobre los paquetes (packages), que son simplemente una colección de clases. En cualquier caso, aquí tenéis una lista con los modificadores de acceso y su significado:

public
Los miembros (variables de instancia o métodos) que se declaran como públicos son accesibles desde cualquier sitio y para cualquiera.
private
Los miembros privados solo se pueden utilizar por cosas dentro de la misma clase donde son definidos.
default
Si un miembro no tiene modificador de acceso, su ámbito es el del paquete que lo contiene.
protected
Los miembros privados pueden utilizarse dentro del paquete donde fueron definidos y en las clases derivadas, aunque estén en distinto paquete.

NO te preocupes si no entiendes esto ahora, volveremos sobre ello mas adelante. Sin embargo es importante hacer una pequeña introducción para que no te asustes cuando veas todas estas palabras pululando por ahí. Las clases también pueden tener un control de acceso, default o public, pero hasta que nos metamos con cosas más complejas no necesitas preocuparte por ello. Por ahora definiremos todas las calases como public, de manera que cualquiera pueda utilizarlas. Bueno, con todo esto superado, ahora nos meteremos con Java en sí mismo y veremos como escribir una clase VRML Script básica.

Un buen tutorial sobre objetos Java (Una clase de clases de clases, ja ja)

Esta sección va a profundizar directamente e introducir en la sintaxis del tipo de clase que puedes utilizar directamente en un nodo Script. Creo que lo que vamos a hacer es simplemente hacer una clase y ya lo explicare luego. Allá vamos...

import vrml.node.*;

public class NuevoScript extends Script {
}
¡Guau, algo de verdadero Java! Increíble. Bien, vayamos línea a línea, comencemos por el principio. La primera línea es la declaración de la clase. En ella se indica que se trata de una clase pública (cualquiera puede utilizarla), se llama NuevoScript y extiende (hereda de) la clase base llamada Script. Script es la clase Java en la que todas los scripts Java para VRML están basadas, y proporciona el entorno de trabajo general, necesario para tus scripts. Todas tus declaraciones básicas de clases para scripts VRML deberían ser muy parecidos a esta, con la única diferencia del nombre de la clase. Si quieres crear una clase partiendo de cero no tendrías la parte 'extends Script'. Es algo poco recomendable en cualquier caso - añadamos un par de variables de instancia.
import vrml.node.*;

public class NuevoScript extends Script {

        public  int     valor_publico;
        private int     valor_privado;  
}
Allá vamos. Ahora tenemos dos variables de instancia, una publica y otra privada. Cualquiera será capaz de ver la publica, pero ninguna otra clase tendrá acceso a la privada. También. Date cuenta de que aquí, en Java, se definen tipos concretos para las variables. En ECMAScript, podíamos cambiar el tipo de la variable en tiempo de ejecución, e incluso añadir miembros a los objetos. Nunca más. En Java, cada variable tiene un tipo concreto, y lo mantiene para siempre. No veremos los tipos de datos ahora, ya los veremos todos mas adelante. Es suficiente con decir que esas dos variables son de tipo entero (todo números). Así que, nuestra clase esta creciendo, pero ¡no tiene ningún método! Que pasa si queremos permitir a la gente que lea el valor de la variable valor_privado, pero no escribirlo. ¡Podemos proporcionar una función que lo haga!
import vrml.node.*;

public class NuevoScript extends Script {

        public  int     valor_publico;
        private int     valor_privado; 

        public int ObtenerValorPrivado() {
                return valor_privado;
        }

        
}

Ahora, cualquiera puede llamar a la función ObtenerValorPrivado() para obtener el valor de valor_privado, porque la función es publica. Se puede leer valor_privado porque forma parte de la misma clase. Puede observarse que aquí, a diferencia de como sucede en otros lenguajes, la implementación de una función va unida a su declaración ( todo de una vez). Es muy parecido a ECMAScript en realidad. Seguro que lo comprendes.

Así que tenemos una clase muy simple para demostrar como se interrelaccionan todas estas cosas entre sí. Veamos como utilizaríamos todo esto en un mundo VRML. Obviamente esto aun no hará nada, pero veremos como hacer que tus scripts realmente funcionen en un mundo VRML en el siguiente asalto.

Ketchup collecting (compiling your source, haha)

Esta bien, ningún otro chiste malo. Lo prometo. Durante un rato, al menos. Ahora que has escrito tu clase Java, ¿qué vas ha hacer con ella? Bien, Java no es como ECMAScript en el sentido de que no es simplemente un fichero de texto que puedes utilizar en tus mundos. Necesitas utilizar algo llamado compilador, que coge tu código fuente (lo que has escrito), y lo compila, transformándolo en un lenguaje que la máquina pueda comprender directamente. En el caso de Java, el compilador crea algo llamado código byte (bytecode), que puede ejecutarse en cualquier sistema que disponga de una maquina virtual Java. Haciéndolo perfectamente portable entre diferentes sistemas operativos.

De modo que, ¿de donde sacamos un compilador? Bien, nos sirve casi cualquier compilador Java siempre que trabaje con Java estándar. Aquellos de vosotros que utilicéis el Visual J ++ de Microsoft podríais tener algún problema. Hay cantidad por ahí, pero hay uno que es totalmente gratuito y tiene todo lo que necesitas. Es la plataforma oficial de Sun del Java 2. Puedes conseguirlo de la web de Sun java.sun.com. Bájatelo, instálalo, ¡y ya esta!. No proporciona una interfaz muy amigable, pero es gratis y tiene todo lo que precisas. Utiliza simplemente un editor de textos para escribir el código y la línea de comandos para utilizar el compilador. Yo lo utilizo para todo lo que hago en Java, así que es lo que usaré para los ejemplos en este y subsiguientes tutoriales.

Para conseguir obtener una clase a partir de nuestro ejemplo NuevoScript, debemos seguir los siguientes pasos. Salvar el código fuente en un archivo llamado NuevoScript.java (es importante que tenga el mismo nombre que la clase definida dentro, además, cada archivo solo puede contener una clase). Después ejecuta la siguiente instrucción:

javac -target 1.1 NuevoScript.java

Esto debería ejecutar el compilador (suponiendo que este instalado correctamente) y crea un archivo llamado NuevoScript.class. Este es el código byte para la clase que acabas de escribir. Si hay algún error en lo que has escrito, el compilador te lo dirá cuando lo ejecutes.

Hay una solo cosa más que necesitas hacer para crear el script Java para VRML, y es decirle al compilador Java donde puede encontrar las clases estándar VRML. La instalación del JDK establece una variable de entorno en tu sistema operativo llamada CLASSPATH, que contiene las rutas para todas las clases estándar. Necesitas añadir las clases VML a esta variable CLASSPATH para que puedas compilar los scripts correctamente.

Las clases VRML se suministran junto con tu visualizador VRML. El Cosmo tiene un archivo llamado npcosmop21.zip, que las contiene, y el Cortona tiene un archivo llamado classes.zip. Deberías de ser capaz de encontrar estos archivos en el directorio de instalación del visualizador. No se nada del resto de visualizadores pero, si alguien sabe algo, comunicádmelo por favor para que incluya la información. Esta información se recopilará en la pagina FAQ de la Guía. Echar un vistazo allí para obtener más información. En cualquier caso, necesitarás añadir esos ficheros a la variable CLASSPATH. El cómo hacerlo dependerá de tu visualizador, el sistema operativo y la configuración. Consulta la documentación de cada uno o pídele a un amigo que sepa hacerlo que lo haga por ti si no eres capaz de arreglártelas solo.

Utilizando clases en tus mundos

Bien, una vez que tienes tu clase, querrás saber como utilizarla en tus mundos VRML. Bueno, todo lo que necesitas hacer es simplemente usar su nombre en un nodo script como lo harías normalmente, algo así:

Script {
        url "NuevoScript.class"
}

Evidentemente, tendrás un gran numero de campos, eventos de entrada, eventos de salida y todo eso en tu Script pero los he omitido arriba. El visualizador buscará en la URL el script, e irá a la dirección que le hayamos indicado a buscarlo.

Bien, creo que es suficiente para digerir por el momento. Os dejare con esto por ahora, y la próxima vez entraremos en como hacer scripts útiles que puedan enviar y recibir eventos y todo eso. ¡Hasta la próxima vez!