Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Contenido CAPÍTULO 23
• Objetivos básicos
• Código de diseño
• Escritura de las clases
• Uso de la Biblioteca
• ¿Qué hace falta?
• Ampliación de la Biblioteca de la cubierta interior de scripts
Objetivos básicos
Al crear una biblioteca de alto nivel como éste, que se basa en una API de nivel
3
Uno de los objetivos que se vio obligado a mí durante el desarrollo para poder
hacer mi trabajo de clases de Java, incluso sin un navegador. Es decir, que
podría funcionar por completo, pero simplemente no transmitir los valores a
través de la VRML navegador. Me enteré de la manera más dura sobre algunos
errores en archivos DLL de RPC de Microsoft (después de pasar una semana y
media de trabajo de lo que estaba mal!), Que significó el applet con el
Netscape no encontrar el navegador de VRML en absoluto. Al final, este
resultado fue una buena cosa, porque, como se verá más adelante en el
capítulo, que hizo el código más fácilmente extensible.
Todo lo que necesitas para estos nodos VRML debe existir en un solo paquete.
Este paquete se llama vlc.vrml.external.geometry. El vlc está para mi empresa,
vrml por razones obvias, ya que el exterior de la aplicación original, funciona
sólo para la interfaz externa y, por último, la geometría porque tengo otras EAI
basada en paquetes y, además de que no desea obtener este paquete
confundirse con cualquiera de los nombres de las clases VRML por llamarlo
nodo.
Para mostrar otra de las razones para crear el paquete exterior, más tarde en
el capítulo I le mostrará cómo se convirtió el código para ser utilizado con su
editor interno. Puesto que los dos no se pueden mezclar, ya que comparten el
mismo método y los nombres de clase, teníamos que usar paquetes Java para
separar la funcionalidad.
Nombres convencionales
Una serie de clases adicionales se utilizan como clases abstractas para los
diversos niveles de clasificación en la jerarquía. Estos suelen ser nombrados
por función. Por ejemplo, todas las texturas son una subclase de la clase
abstracta de textura, aunque la lista de nodos de VRML no contienen una pura
textura nodo.
VrmlObject: El núcleo de clase
23.1 La lista VrmlObject clase base para el Nodo JVerge las clases
vlc.vrml.external.geometry paquete;
java.io.PrintStream de importación;
vrml.external.Node de importación;
Cada uno de estos grupos se explica con más detalle más adelante en el
8
En esta sección voy a detalle cómo iba escrito sobre una de las clases. Después
de mostrar la estrategia básica, iré a explicar algunos de los problemas
encontrados durante el diseño y la ejecución de determinados nodos.
A partir de Apagado: El Punto de vista de clase
NOTA: Cuando comencé este proyecto, que comenzó con la Forma nodo. Se
forma el punto lógico donde empezar, ya que pude ver los resultados que
aparecen en la pantalla, a diferencia de la mayoría de los otros nodos. Por lo
tanto, tengo todo el beneficio de la retrospectiva lanzada en derecho desde el
principio.
¿Qué navegador?
Para cada nodo, existen dos constructores. Se tiene el usuario del navegador
proporcionado por referencia de objetos, y el otro usa el método estático
getBrowser de la EAI. Hasta la beta 3 de CosmoPlayer, VRML no apoyó la
getBrowser método estático, por lo que la antigua JavaScript / LiveConnect
interfaz tenía que ser utilizada para hacerse con el navegador. En este caso, es
necesario pasar a manejar alrededor de este único lugar de tratar de obtener
cada vez que crea un nodo. También sería un poco más rápido, ya que existe
un sistema de consulta menos. Antes de continuar, Listado 23,2 contiene la
fuente a Viewpoint.java.
vlc.vrml.external.geometry paquete;
importación java.io. *;
importación vrml.external .*;
importación vrml.external.field .*;
de opinión pública ()
(
B = Browser.getBrowser navegador ();
if (b == null)
retorno;
createFields ();
)
createFields ();
)
de opinión pública (String descripción)
(
Vrml_string cadena;
if (b == null)
retorno;
_description = descripción;
si (descripción! = null)
vrml_string + = "descripción" + descripción;
vrml_string + = ")";
createFields ();
)
if (b == null)
retorno;
_description = descripción;
si (descripción! = null)
vrml_string + = "descripción" + descripción;
vrml_string + = ")";
11
createFields ();
)
_get_bindTime_changed =
(EventOutSFTime) node.getEventOut ( "bindTime_changed");
_get_isBound = (EventOutSFBool) node.getEventOut ( "isBound");
have_browser = true;
type = vlc.vrml.VrmlTypes.Viewpoint;
)
for (i = 0; i <guión; i + +)
buffer.append ( "");
if (nombre! = null)
fp.print ( "DEF" + nombre + "");
if (_fieldOfView! = 0.785398f)
fp.println (buffer.toString () +
"FieldOfView" + _fieldOfView);
if (! _jump)
fp.println (buffer.toString () + "salto FALSE");
12
if ((_position [0]! = 0) | |
(_position [1]! = 0) | |
(_position [2]! = 1))
fp.println (buffer.toString () + "la posición" +
_position [0] + "" +
_position [1] + "" +
_position [2]);
if (_description! = null)
fp.println (buffer.toString () + "descripción"
+ _description);
¿Por qué no he incluido en los otros campos más grandes de este constructor?
La razón básica es la simplicidad. VRML Si nos proporciona el mecanismo para
fijar un valor del campo después de crear el nodo y, a continuación, haremos
uso de ella. Quería reducir al mínimo la cantidad de código y el número de
parámetros para el constructor. Sólo los campos que corresponden a un campo
tipo de acceso será pasado al constructor. Esta parte es fundamental, por una
vez el nodo se crea, no puede asignar nuevos valores para este campo. Los
valores deben ser asignados en la creación de tiempo, y es que cuando
pedimos el constructor.
Configuración de campo
A veces cuando tengo sólo un campo para obtener, esto podría parecer como
un desperdicio, con lo que todos los gastos adicionales que el método de
llamada. Sin embargo, con la tecnología de compilador agresivo en estos días,
el compilador en línea que por lo general el método directamente en el
constructor, que la eliminación de gastos generales. En aras de la simplicidad y
coherencia, incluso si sólo tenemos un campo para obtener, siempre habrá una
llamada a este método.
Limpieza general
Después de crear un nuevo nodo, tenemos que ser capaces de establecer las
propiedades. Tenemos que escribir algunos métodos para establecer y
recuperar los valores del campo. Se trata de un asunto relativamente sencillo,
normalmente con sólo dos partes: el establecimiento de la clase interna de la
representación, el navegador y la información del cambio.
Limpieza de
Al final del día, tenemos que asegurarnos de que todo está ordenado. Para
asegurarse de ello, cualquier clase interna que crea copias de tales arreglos y
se han definido el método de limpieza para que la clase (en lugar de basarse
en el valor predeterminado de un vacío VrmlObject).
El Punto de vista de clase le faltaba sólo una cosa: No contiene ningún niño
nodos. Este es un aspecto importante que debe ser cubierto. Los niños
presentan un aspecto interesante a tratar.
En una serie de nodos, que sólo puede tener un determinado tipo de nodo de
VRML que el niño para un determinado campo. Hasta ahora hemos podido
evitar las capas de las clases abstractas y sólo subclassed VrmlObject
(haciendo caso omiso de cualquier argumento sobre la aplicación de la
funcionalidad común en una clase base). Uno de los objetivos de diseño fue
para garantizar la correcta sintaxis de VRML en el nivel de programador. Para
aplicar esto, permitir que sólo un nodo en particular la clase que se pasa al
método establecido.
Añadir un nodo
Como ejemplo, ver la forma nodo. Tiene dos SFNode exposedFields, uno para la
geometría y un aspecto de un nodo. En este último caso, esto es fácil de tratar,
ya que podemos especificar que el argumento de set_appearance ser un
aspecto de clase. No hay problema. Pero ¿qué ocurre con la geometría? No hay
nada en común entre cualquiera de los nodos de la geometría.
Resolver este problema es muy simple, también. (¿No hay una gran cantidad
de soluciones simples, en este capítulo) podemos crear una clase abstracta
llamada vacío Geometría que VrmlObject subclases. Todos los nodos de la
geometría puede esta subclase, y el método set_geometry VRML puede hacer
valer nuestras reglas sintácticas mediante la solicitud de que sólo las clases
basadas en la geometría se pueden pasar a él.
Eliminar un nodo
Una vez que haya decidido eliminar un nodo, tendrá que hacer lo contrario con
el proceso mencionado. Para eliminar un nodo, usted puede pasar un nulo para
el método apropiado en la clase de VRML.
limpieza de circuito a través de cada nodo y enviar a una persona para cada
evento removeChildren nodo hijo, en vez de limitarse a llamar set_children
(null). Es probable encontrar un par de cosas como esta todo el código.
Otras estrategias Nodo
Varios de los nodos de VRML siempre más interesantes retos a superar, aparte
de los descritos anteriormente. En esta sección, voy a describir brevemente
estos problemas y cómo se sobrepuso a ellos.
Nodos de audio
En lugar de ello, he tenido que utilizar una interfaz para lograr los mismos
resultados. La textura se extiende ahora MovieTexture y aplica AudioNode. Sin
embargo, esta solución también da lugar a otras trampas.
if (have_browser)
(
if (fuente! = null)
_set_source.setValue (_source.node);
algo más
19
_set_source.setValue (null);
)
)
¿Por qué debería ofrecer sólo un nodo de Grupo? Para añadir y eliminar nodos
dinámicamente a partir de la representación, es necesario que usted tenga
algún tipo de agrupación nodo. El Grupo de nodo es el más ligero, y si es
necesario para mover el poder de transformación con un sobre, usted siempre
puede añadir a la transformación del Grupo.
Tras esta decisión, el resto es fácil, ¿verdad? Digamos que crear el nodo con la
siguiente llamada:
Pero en nuestro caso anterior, los dos grupos son en realidad la misma cosa.
Añadir un nodo al segundo grupo de medios que aparece automáticamente en
la primera, por lo tanto, como la definición de la geometría del proxy. La razón
de tener la USO en el nivel superior es para que podamos recuperarlo de la
serie de nodos que son devueltas de crear la llamada.
2. Luego de crear una instancia del nodo que desee. Si usted tiene un pre-
existente de objetos del navegador, que pasa al constructor. Si usted tiene
21
La construcción de una escena gráfica es tan simple como agregar nodos como
hijos de otros nodos. Para un buen ejemplo de ello, echar un vistazo a el editor
que se presenta en el capítulo 12. La mayoría de las estructuras de datos
internas se basan en esta biblioteca.
¿Qué hace falta?
Lo creas o no, todavía hay un poco de trabajo de desarrollo que queda por
hacer en este paquete. He señalado algunos de los agujeros como he ido a lo
largo. El tema principal de estas mejoras es la mejora de la robustez del
sistema en general.
tratar directamente con el EAI y en su lugar creó VRML, ¿no sería bueno para
ofrecer el mismo nivel de abstracción para la interfaz de secuencias de
comandos como así? Con un poco de trabajo, se puede. He aquí cómo hacerlo.
vlc.vrml.internal.geometry
Lleve una copia de todas las clases desde el exterior de código y copiarlo en
otro directorio que contiene el nuevo paquete.
para
intentar
(
nodo = (Nodo) b.createVrmlFromString ( "Caja {}")[ 0];
)
de capturas (InvalidVRMLSyntaxException e)
(
)
Así era él. El cambio es básicamente uno de pura fuerza muscular. No hay
cosas que hay que considerar interrelacionados con las distintas API. Todo lo
que hay que hacer es ir a través de todos los impares de los 60 archivos y
hacer lo mismo, una y otra y otra vez. ...
juntos. A lo largo del camino, usted ha tenido que ver cómo he diseñado en el
sistema una gran cantidad de código adicional para manejar los errores no sólo
en el navegador de VRML, pero también la JVM que se utiliza para ejecutar el
código en. Incluso Microsoft logró su cabeza en el camino y la fuerza adicional
de programación en mí.
Lo que queda para nosotros a cubrir? Hemos pasado por casi todo: VRML,
convertidores, sistemas multiusuario, y mucho más. ¿Qué ha quedado? ¿Cómo
sabes que lo que usted tiene en su código de estructuras de datos en realidad
representa lo que el navegador está mostrando? Siga leyendo para obtener
más.