Así es Asdru, parece que cada cual va sacando adelante su propia experiencia en programación y así es bien difícil enfocarnos en lo que nos interesa, que no es nada más que las posibilidades que el lenguage LUA nos da (la única en realidad) para poder conseguir alguna semejanza descente entre una locomotra real y el modelo que se pretende hacer para el simuador.
De partida te digo que equivocas el planteamiento de discusión respecto al script. Acá no se trata de entender o interpretar una rutina en particular, como la que tú has mostrado. Lo que necesitamos entender es como se usa el LUA para hacer conseguir cosas en TS2013.
Para empezar, tenemos que entender las funciones propias de un script del simulador.
En el script para locomotoras tenemos dos funciones imprescindibles, que al final son las más útiles. "Initialise" y "Update".
La función "Initialise" solo corre o se ejecuta al principio una sola vez y es donde debemos declarar las variable de inicio, luego estas variables podrán cambiar, pero mientras tanto, acá podemos establecer valores con los que queremos empezar, es un poco como determinar el valor "default" de los controladores en el engine blueprint, la diferencia es que acá podemos establecer los valores originales de las variables.
Por otro lado la función Update se ejecuta por cada frame del simulador, los frames del simulador son nuestra real unidad de tiempo, no el tiempo real. Cada PC, dependiendo de su hardware, irá en más o menos frames por segundo, eso lo sabemos todos, la función Update se repetirá una vez por cada frame, es decir, acá es donde tenemos que poner las rutinas que representen cambios durante la simulación. Si ponemos dentro de la función Update una condición del tipo "If" entonces esa "pregunta" se repetirá en cada frame del simulador, y eso es bueno si queremos que ante un cambio en algun valor esa condición "If" la registre y haya alguna reacción correspondiente.
Otra cosa importantísima es conocer como obtengo o leo y como establezco o escribo el valor de un controlador.
Un controlador puede tener distintos valores en el tiempo, y tú puedes conocer el valor actual de este controlador y además puedes modificar, cambiar y establecer un nuevo valor para ese controlador.
Para conocer el valor del controlador se usa la siguiente frase:
- Código: Seleccionar todo
Call("GetControlValue", "NombredelControlador", 0)
y esto se debe asignar a una variable como en:
- Código: Seleccionar todo
gMiVariable = Call("GetControlValue", "NombredelControlador", 0)
Si uno coloca esto dentro de la función Update, la variable llamada "gMiVariable" valdrá lo mismo que el valor del controlador en cada frame del simulador.
Luego, uno puede traspasar el valor de la variable llamada "gMiVariable" a otro controlador, para aquello se debe usar:
- Código: Seleccionar todo
Call("SetControlValue", "NombreDelOtroControlador", 0, VALOR)
o lo que es lo mismo:
- Código: Seleccionar todo
Call("SetControlValue", "NombreDelOtroControlador", 0, gMiVariable)
Supongamos que tengo dos controladores llamados, por ejemplo, "Regulator" que es el que realmente da tracción a una locomotora y otro que hemos inventado llamado "VirtualThrottle" al cual hemos asignado el movimiento de la palanca de aceleración.
Si queremos que la palanca transmita el mismo valor de la palanca al controlador real deberiamos poner en la función Update lo siquiente:
Inventamos una variable que llamaremos "gVinculo"
Entonces:
- Código: Seleccionar todo
gVinculo = Call("GetControlValue", "VirtualThrottle", 0) -- acá estamos poniendo el valor de controlador VirtualThrottle en la variable llamada "gVinculo"
Luego hacemos el traspaso del valor así:
- Código: Seleccionar todo
Call("SetControlValue", "Regulator", 0, gVinculo) -- acá estamos dándole un valor al controlador llamado "Regulator"
¿Qué valor? El valor que ya habiamos asignado a esa variable, es decir el valor del controlador "VirtualThrottle".
No se si decir lamentablemente o afortunadamente, para manejar estas cosas, se debe hacer muchos experimentos y practicar mucho, ojalá, en locomotoras de prueba para ver como ir pasando los valores de un controlador a otro. Un buen ejercicio, que yo usé al principio para entender este funcionamiento fue hacer sonar el silbato de la locomotora si otro valor cualquiera era en algun momento igual a 1.
Por ejemplo la siguiente rutina:
- Código: Seleccionar todo
Function Update (time)
If Call("GetControlValue", "Sander", 0) == 1 then
Call("SetControlValue", "Horn", 0, 1)
end
end
Al poner esta simple rutina dentro de la función Update, tal y como está puesta en el ejemplo, se consigue que cada vez que el arenador, es decir el controlador llamado "Sander" este activo, o sea, tenga el valor: 1, entonces el valor del controlador llamado "Horn" será también 1. En definitiva, cada vez que se active el arenador, sonará el silbato.
Bueno, quizá me fui a lo muy básico, pero es que creo que es imposible hacer un buen script sin saber estas cosas básicas. Me gustaría seguir mostrando más ejemplos de como funcionan estas cosas básicas, para luego ir complicándolo todo mucho más. Con los conceptos básicos aprendidos luego se puede hacer lo que uno quiera, solo hará falta la creatividad.
Digánme qué opinión les merece estas líneas que he escrito, si son útiles y oportunas, en base a eso veremos si seguimos con otros ejemplos.
Saludos.
Ricardo.