History: Crea juegos con Love2d

Revision made 6 years ago by Francisco Presencia. Go to the last revision.

Love2d o LÖVE es un framework que permite hacer juegos con Lua. Su fuerte son los juegos de plataformas 2d pero se puede usar para muchos otros tipos de juegos. Es simple, potente, y puedes crear un clon de Mario Bros como vamos a ver en este curso.

Para aprovechar el tutorial, descárgate Love2d en https://love2d.org/ y para escribir los programas, si no tienes un Linux o macOS, la cosa se hace más sencilla con el programa Zerobrane, que lleva Lua preinstalado:

https://studio.zerobrane.com/download

Si no sabes Lua, te recomiendo nuestro curso en Libre University:

https://es.libre.university/lesson/B1Pll0oCg

Una vez que tengas todo, empieza a darle caña al framework.

Funciones importantes

El juego más básico en Love es un archivo main.lua ubicado en una carpeta que puede tener otros archivos de Lua, imágenes, música para el juego. En esencia la estructura de un main.lua es:

function love.load()
  -- aquí creamos todos los objetos del juego
end

function love.update() 
  -- love.update() puede tomar un parámetro de tiempo dt
  
  -- aquí cambiamos el estado de los objetos
  -- es la lógica interna del juego
end

function love.draw()
  -- aquí dibujamos los objetos en pantalla
end

Estas funciones son ejecutadas automáticamente por Love en ciertos momentos, y se llaman callbacks, literalmente "llamadas al revés", porque  a esas funciones no las llamamos nosotros en ningún momento, pero sí las llama el programa. Hay algunas más, como love.mousepressed, love.keyreleased, love.quit, y love.focus. Al usarlas, el juego se hace más simple de programar, úsalas.

El tema de paquetes

El love.bla viene de que tenemos que importar la función de Love, no la hacemos nosotros desde 0 que digamos. No sé si te acuerdas, pero en la clase de Lua vimos una función, io.write, que escribía el texto en la pantalla o consola. Era, en realidad, la función write del paquete io, de entrada y salida de texto.

Lua tiene algunos paquetes incluidos, tipo math, table, io, y podemos instalar librerías externas como Love, ampliando así las posibilidades del lenguaje. Por cierto, Love también tiene subpaquetes de física, cálculo, manipulación de imágenes, texto, pero ya me estoy adentrando demasiado :)

Ejecuta programas, no personas

Escribir código no sirve de nada, si no se ejecuta o usa. Para ejecutar nuestro primer programa de Love completa la función love.draw del programa base con:

function love.draw()
    love.graphics.print('¡Love2d mola mazo!', 500, 400)
end

Una vez escrito, guarda el programa como "main.lua", entra con la consola en el directorio del juego si estás en linux, y escribe:

$ love .

Sin el símbolo del dólar, que aclaro para los de Windows que es el símbolo del shell :) Así, te aparecerá una ventana negra de 500 por 400 píxeles, con la frase que pasamos a la función como primer argumento. El programa se habrá ejecutado.

Si usas mac, abre el terminal, y teclea:

$ open -n -a love "~/camino/a/mi/juego"

Con Windows, te recomiendo ejecutar el archivo en Zerobrane. Al abrirlo con amor (humor malísimo, eh) te saldrá la ventana igual que en los casos anteriores.

Hagamos nuestro juego de plataformas

O de como nos copiamos descaradamente de Mario Bros.

Vayamos desarrollando el juego paso a paso. El código final y los materiales necesarios se hallan en:

https://github.com/jxub/lua-workshop

Luego de bajarnos y descomprimir el .zip, tenemos algo así:

/lua-workshop
  /sprites
    (las imágenes)
  main.lua
  player.lua
  platfrom.lua
  mario_soundtrack.mp3

En este tutorial, no vamos a escribirlo todo de cero, ya que nos llevaría demasiado (el player.lua tiene más de 100 líneas). En vez de eso, léete e intenta entender el código de player.lua y platform.lua, que por cierto va bastante bien comentado. Eso sí, bórrate el contenido de main.lua, que lo iremos escribiendo y explicando paso a paso.

El programa, despasito

Empezamos con un main.lua en blanco. Primero, escribe los tres callbacks esenciales para el juego, iguales que vimos antes:

function love.load()
  
end

function love.update() 
  
end

function love.draw()

end

Con esto, la estructura del juego ya la tenemos lista.

Ahora, declararemos dos variables en love.load, ya que se repetirán mucho en todo el código. En programación, es muy importante repetirse lo menos posible y hacer el código lo más modular posible. Así, hay menos bugs o errores y el código es más fácil de entender. Añade las variables dentro del primer callback:

width, height = love.graphics.getDimensions()

La función devuelve dos valores que son el alto y el ancho de la ventana. Una vez que lo tenemos, léete el código de platform.lua, que es muy breve. Tiene una función platform:new() asociada a la tabla de platform, y la usaremos para crear la plataforma donde pondremos el personaje. Como usaremos los dos ficheros player.lua y platform.lua, los importamos al main, que en lua se hace con un require. Escribe en las primeras líneas para importar los ficheros:

require "platform"
require "player"

Ahora podemos ya usar las funciones de ambos archivos. Como siempre, mola tener tu código en varios archivos, así los puedes tener agrupados por funcionalidad y no meterte en líos a la hora de extender la funcionalidad. Haces otro archivo, o fichero si la cosa es muy grande, y listo.

Links interesantes

La wiki oficial:

https://love2d.org/wiki/Main_Page 

Funciones callback en español:

https://love2d.org/wiki/Tutorial:Callback_Functions_(Espa%C3%B1ol)

Empaqueta tu juego en un ejecutable:

https://love2d.org/wiki/

Un huevo de tutoriales:

https://love2d.org/wiki/Category:Tutorials

Otra guía de love, mejor que la mía:

http://nova-fusion.com/2011/06/14/a-guide-to-getting-started-with-love2d/

Tutorial de otro juego de plataformas en Love:

http://osmstudios.com/tutorials/love2d-platformer-tutorial-part-1-the-basics