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.
Cómo es un script
Sección titulada «Cómo es un script»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 = 3end
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") endend- 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 tablasAudio,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) |
Solo en Lua
Sección titulada «Solo en Lua»- Secuencias con espera. Una acción que ocurre poco a poco se escribe en línea recta.
wait,waitStepsywaitUntilpausan 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, ySave.get("inventario", {})la devuelve. - Listas de instancias.
all("Zumbi")devuelve la lista, yeach("Zumbi", function(z) ... end)pasa por todas. - Código dividido en archivos.
local jogo = require("src.jogo")cargasrc/jogo.lua, bueno para lo que vale en todo el juego (puntos, vidas).
Escribir el código
Sección titulada «Escribir el código»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.
Qué saber antes de elegir
Sección titulada «Qué saber antes de elegir»- 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.
