Realidad Virtual
información adicional
jaume ferrer i rosera
5. SCRIPTING Y ROUTES: Comentario sobre el Ejemplo 1
El uso de scripting se basa en el principio básico de que para llamar a una función se envía un evento a un campo del mismo nombre que admita entrada desde el exterior (eventIn o exposedField).
En el Ejemplo 1, el botón de marcha/paro en forma de esfera roja llamado SensorBotonVa contiene un TouchSensor que al detectar el clic de nuestro ratón envía un evento de tiempo a través de un ROUTE hasta el nodo de script ArrancaPara:
ROUTE SensorBotonVa.touchTime TO ArrancaPara.allaVamos
Este route debe leerse del modo siguiente: el SensorBotonVa dispone de un campo de salida llamado touchTime que envía su evento a un campo de entrada llamado allaVamos que se halla en el nodo ArrancaPara. Si repasamos el código veremos que efectivamente existe un eventIn llamado allaVamos en el nodo ArrancaPara, pero que no existe un campo llamado touchTime en el nodo SensorBotonVa. Esto se explica porqué los nodos de tipo TouchTime (así como otros nodos como los SensorTime, por ejemplo) disponen por defecto de una serie de campos de entrada y salida que podemos usar sin necesidad de explicitar en la definición del objeto.
Cuando el campo allaVamos del nodo ArrancaPara recibe un evento llama a la función del mismo nombre que se encuentre dentro del propio nodo. ¿Qué hace esta función?
|
function allaVamos(v,t){ //función de marcha-paro
|
Verifica en qué estado se encuentra un campo llamado como. Este campo es de tipo SFBool, es decir, sólo puede contener dos valores: verdadero o falso (TRUE o FALSE). Este tipo de campos se usan para variables de control. En este caso, suponemos que siempre que como valga FALSE la aplicación está parada y siempre que valga TRUE estará en marcha. Por tanto, el primer if() verifica si la atracción está funcionando o no. Si no funciona pone como en TRUE para anunciar que va a funcionar y llama a la función gira(), que es la que realmente se encarga de hacer girar los objetos. Si por el contrario encuentra que como vale TRUE, puesto que ya estará en marcha, pone como en FALSE y no llama a la función gira().
Para que esto tenga sentido debe tenerse en cuenta que la función gira() empieza con un if() que verifica el estado de como. Si lo encuentra en FALSE ya no ejecuta su código y los objetos dejan de girar. ¿Por qué volvemos a verificar el estado de como en la función gira()?. Porque un SensorTime llamado motorGira está enviando continuamente eventos que son capturados por el campo gira del nodo de script ArrancaPara, según el route siguiente:
ROUTE motorGira.fraction_changed TO ArrancaPara.gira
Por tanto, la función gira() está recibiendo constantemente llamadas y sólo ejecutará su código para hacer rotar los objetos si como vale TRUE y ya hemos visto que el estado de como depende de la función allaVamos(v,t).