Para comenzar a utilizar el motor GearX y crear comportamientos interactivos mediante Lua, es necesario seguir un flujo de trabajo específico para vincular los scripts lógicos con los objetos de la escena.
Configuración Inicial del Proyecto
El primer paso consiste en generar un nuevo objeto dentro del escenario. Una vez creado, deben adjuntarse los componentes esenciales: Transform, para la posición; Texture, para la apariencia visual; y Script, que contendrá la lógica de programación.
Dentro del componente de script, existe una propiedad para ejecutar código en cada fotograma (bucle de juego). Por defecto, el motor funciona a 60 FPS. Es importante notar que el editor integrado en el motor aún no soporta correctamente caracteres especiales, por lo que se recomienda encarecidamente editar los archivos .lua utilizando un entorno externo como VS Code o un editor de texto simple antes de guardarlos en el directorio Scripts.
Para verificar que la comunicación entre el motor y el script funciona correctamente, se puede escribir una función simple en el archivo de bucle:
-- demo.lua
-- Obtiene la referencia a la entidad actual mediante 'Self'
local entidadID = self:obtenerIdentificador()
io.write("ID de la entidad activa: ", entidadID, "\n")
Después de guardar el archivo, debe pulsarse el botón "Actualizar scripts" en la pestaña del nivel. Posteriormente, active el "Modo juego" y luego déselo para inspeccionar la consola de comandos y validar la salida.
Acceso a Componentes y Física
Para implementar interacciones más complejas, como colisiones, se requiere configurar dos objetos: uno estático y otro dinámico (con masa mayor a 0 y tipo de cuerpo rígido dinámico), situando este último encima del primero. Esto permitirá probar las respuestas físicas.
El sistema de scripts permite definir múltiples archivos de código asociados a eventos específicos del ciclo de vida del objeto:
- Inicio de juego:
init.lua - Bucle de actualización:
update.lua - Inicio de contacto:
contacto_inicio.lua - Fin de contacto:
contacto_fin.lua
Implementación de la Lógica
A continuación, se presenta la reimplementación de la lógica para gestionar la entrada del teclado, modificar el color del objeto dinámicamente y responder a colisiones.
Archivo: init.lua
Este script establece las variables de estado y suscribe una función para detectar la pulsación de la barra espaciadora, aplicando un impulso vertical.
-- init.lua
-- Inicialización de estado
local tiempoAcumulado = 0
local teclaPresionada = false
-- Función de callback para eventos de entrada
local function gestorEntrada(objeto, evento)
if evento.type == EventType.Keyboard.KeyDown then
if evento.keyboard.keysym == evento.keyboard.Key_.Space then
-- Aplicar fuerza hacia arriba
objeto.RigidBody:aplicarImpulsoLineal({ 0, -12.0 })
teclaPresionada = true
print("Impulso aplicado hacia arriba")
end
elseif evento.type == EventType.Keyboard.KeyUp then
if evento.keyboard.keysym == evento.keyboard.Key_.Space then
teclaPresionada = false
print("Entrada liberada")
end
end
end
-- Registrar el gestor de eventos en la entidad actual
Event:suscribir(Self, gestorEntrada)
Archivo: update.lua
Este bloque se ejecuta cada frame. Si la barra espaciadora está mantenida, calcula nuevos valores RGB basados en funciones trigonométricas para alterar el color de la textura.
-- update.lua
if teclaPresionada then
tiempoAcumulado = tiempoAcumulado + DeltaTime
local nuevoColor = {}
-- Cálculo de componentes de color usando seno y coseno
nuevoColor[1] = math.cos(tiempoAcumulado * 2) * 0.5 + 0.5
nuevoColor[2] = math.sin(tiempoAcumulado * 3) * 0.5 + 0.5
nuevoColor[3] = math.sin(tiempoAcumulado * 4) * 0.5 + 0.5
-- Aplicar el color calculado a la textura
Self.Texture:establecerMatiz(nuevoColor)
end
Archivo: contacto_inicio.lua
Al detectarse una colisión, se acelera el ciclo de teimpo para intensificar el cambio de color visualmente.
-- contacto_inicio.lua
tiempoAcumulado = tiempoAcumulado + (DeltaTime * 8)
Archivo: contacto_fin.lua
Cuando los objetos dejan de tocarse, se reinicia el contador de tiempo para volver al estado base.
-- contacto_fin.lua
tiempoAcumulado = 0