Ir al contenido
Descargar

Juegos en Lua

Al crear un proyecto, eliges el lenguaje del juego: Lua o C++. En Lua, Play abre el juego al momento, sin compilar y sin instalar nada más. Es el camino recomendado para empezar.

Cada objeto tiene un script al lado: el objeto Jogador usa objects/Jogador.lua. El script define los eventos del objeto como funciones que reciben la instancia, self:

function onSpawn(self)
self.vidas = 3
end
function onUpdate(self)
self.hspeed = axis("esquerda", "direita") * self.velocidade
if pressed("pular") and self:onGround() then self.vspeed = -4 end
if held("atirar") then spawn("Bala", self.x, self.y, "Instancias") end
end
  • Lo que es de la instancia usa self: los campos (self.x, self.hspeed, self.sprite) y los métodos (self:destroy(), self:onCollide(...), self:moveAndStop()).
  • Lo demás son funciones sueltas: spawn, count, held, pressed, axis, drawText, goTo, random, y las tablas Audio, Save, Ui, camera.
  • Puedes guardar lo que quieras en self (self.vidas = 3): cada instancia tiene lo suyo.
  • Las variables creadas en el Inspector llegan como campos de self (self.velocidade), ya con el valor de cada instancia.
  • Una función del script la llaman los otros objetos con dos puntos: inimigo:levarDano(1).

Los nombres son los mismos de la Referencia de la API, que muestra los ejemplos en C++. Para pasarlos a Lua:

En C++ En Lua
hspeed = 2; self.hspeed = 2
destroy(); self:destroy()
spawn<Bala>(x, y, "Instancias"); spawn("Bala", self.x, self.y, "Instancias")
onCollide<Inimigo>([this](Inimigo& outro) { ... }); self:onCollide("Inimigo", function(outro) ... end)
after(60, [this] { ... }); self:after(60, function() ... end)
count<Moeda>() count("Moeda")
Audio::play("tiro", {.volume = 0.4f}); Audio.play("tiro", { volume = 0.4 })
Ui::get("Hud")["Vida"].setValue(0.5f); Ui.get("Hud")["Vida"]:setValue(0.5)
scene().camera.shake(3, 0.2f); camera.shake(3, 0.2)
Save::set("recorde", pontos); Save.set("recorde", pontos)
  • Secuencias con espera. Una acción que ocurre poco a poco se escribe en línea recta. wait, waitSteps y waitUntil pausan solo la secuencia; el juego sigue:
self:run(function()
wait(2) -- 2 segundos
spawn("Chefe", 160, 40, "Instancias")
waitUntil(function() return not any("Chefe") end) -- até o chefe morrer
fadeTo("Vitoria")
end)
  • Tablas en Save. Save.set("inventario", { "espada", "escudo" }) guarda una tabla entera, y Save.get("inventario", {}) la devuelve.
  • Listas de instancias. all("Zumbi") devuelve la lista, y each("Zumbi", function(z) ... end) pasa por todas.
  • Código dividido en archivos. local jogo = require("src.jogo") carga src/jogo.lua, bueno para lo que vale en todo el juego (puntos, vidas).

Abrir código (en el Inspector del objeto) abre el script en una pestaña del propio editor, con colores y autocompletado: al escribir self., self: o Audio. aparece la lista de lo que existe, con la forma de uso al lado. Tab o Enter aceptan la sugerencia. Play guarda lo que está abierto antes de correr.

Un error en el script aparece en la Saída (Salida) con el archivo y la línea; al hacer clic te lleva allí. El juego no se cierra: lo demás sigue corriendo.

  • Un proyecto es en Lua o en C++: los dos no se mezclan.
  • Lua es más lento que C++ en las cuentas del propio script. En un juego común no se nota: mil objetos con script ocupan cerca del 5% del tiempo de un cuadro. Solo con varios miles a la vez empieza a pesar.
  • Un juego en Lua exportado lleva los scripts, legibles, en la carpeta data.
  • Para proyectos en C++, el instalador necesita el Soporte de C++. Mira Instalación.