Ir al contenido principal

Quiéres estos diseños en tu ropa o en diferentes productos?

Publicidad

Cómo crear un videojuego con pocos conocimientos en Love2D

Un saludo a todos, recientemente estuve pensando en si era posible hacer un videojuego con lo que he publicado en esta serie de tutoriales de Love2D, obviamente que no sería un juego de la más alta calidad y que tenga todos los aspectos básicos que los juegos actuales poseen, pero como me limitaré a solo los tutoriales que he creado hasta hora me he dado cuenta de que si es posible, así que en esta oportunidad les mostraré un juego creado usando pocos conocimientos de Love2D.

Lo que deberías saber:

Como ves son pocas las cosas que necesitaremos para desarrollar este pequeño  juego. En sí se tratará de una versión inspirada de Road Fighter de la consola Nintendo aunque mucho más simple, Veamos que necesitaremos.

Uso de tablas en Lua

Las tablas en Lua son muy útiles y facilitan mucho el desarrollo de nuestros juegos, no voy a ahondar aquí en ese tema, pero si explicare un poco sobre esto.

Una tabla en Lua se define así.

nombreDeTabla = {}

nombreDeTabla = {1,2,3,4,5,6}

En la primera estamos creando una tabla vacía, y en la segunda la llenamos con esos números inicialmente. Las tablas en Lua pueden contener cualquier tipo de valor, pueden ser número, texto u otra tabla.

tabla1 = {"hola","mundo",1,2,3,4}

tabla2 = {tabla1,"contiene una tabla",123}

tabla3 = {{1,2,3},4,5,6}

También podemos llenar nuestra tabla de la siguiente manera y acceder a sus valores.

tabla = {}

tabla[1] = 1

tabla[2] =45

tabla[3] = "texto"

print(tabla[3])  -- muestra por consola: texto

Las tablas en Lua empiezan desde el índice 1, normalmente la mayoría de los lenguajes de programación utilizan el índice 0, así que si ya vienes de otro lenguaje ten en consideración esto para no cometer errores.

También es posible agregar elementos a nuestra tabla y acceder a ellos mediante una palabra clave.

tabla = {clave1 = "hola", clave2 = "mundo"}

print(tabla.clave1, tabla.clave2)

Se muestra por consola: hola, mundo.

tabla = {}

tabla.nombre = "naido"

tabla.apellido = "programs"

print(tabla.nombre, tabla.apellido) -- consola: naido,programs

 

Recorrer el contenido de una tabla en Lua

Para poder recorrer todos los elementos de una tabla usamos el bucle for.

tabla = {"love2d","es","muy","fácil","de","aprender"}

for indice,valor in ipairs(tabla) do

    print(indice, valor)

end

consola:

1    love2d

2    es

3    muy

4    fácil

5    de

6    aprender

Aquí el bucle "for" nos permite obtener a la vez el índice y el valor del elemento de la tabla, lo cual es muy útil.

 

Cambiando el tono de nuestro audio

En este pequeño juego decidí colocarle sonido al carro y que se percibiera como que iba aumentando las revoluciones así que utilice una de las funciones de Love2D que aunque no la he explicado en las entradas anteriores lo haré aquí para que quede claro y puedas entender como hacerlo, en una publicación futura me concentraré en la librería de audio de Love2D para dar a conocer todo su potencial.

Recordemos que para cargar un archivo de audio utilizamos lo siguiente.

variableAudio = love.audio.newSource("direccion/del/archivo.mp3","stream o static")

Y para cambiar el tono solo tenemos que agregar el siguiente comando.

variableAudio:setPitch(valor) --valores mayores que 1, cero no es válido

El valor 1 es el tono normal o base del audio que usemos, cada reducción del 50% equivale a 1 octava por debajo del tono base, y cada duplicación del valor sería una octava por encima.

setPitch(0.5) -- una octava por debajo de la original

setPitch(2) -- una octava por encima de la original

 

Un juego simple que requiere pocos conocimientos

Controlas a un vehículo que va a toda velocidad por una autopista y vas pasando automóviles que van a distintas velocidades obligándote a esquivarlos para no chocar contra ellos, tienes un límite de combustible y para alargarlo hay un vehículo distinto a todos los demás que puede tocar y al hacerlo obtendrás algo de combustible extra. El juego termina cuando el combustible se te acaba o golpeas a alguno de los vehículos, tomando el tiempo que duraste como tu puntaje. Como ves no es un juego muy impresionante, pero en sí el objetivo es que aprendas a crear tu propio juego usando este fantástico motor de juegos.

 

Cargando los recursos del juego e iniciando las variables

Ya sabes que lo primero que debemos hacer es cargar las imágenes, audio e inicializar las variables de juego. Para este pequeño ejemplo necesitamos las imágenes de los vehículos y el medidor de combustible y velocidad, el audio del motor, y la música de fondo.

function love.load()
 
     --audio
     musicSound = love.audio.newSource("recursos/music.mp3","stream")
     motorSound = love.audio.newSource("recursos/engine.mp3","stream")
     fuelSound = love.audio.newSource("recursos/fuel.mp3","static")
 
     --imagenes
     indicatorImage = love.graphics.newImage("recursos/indicator.png")
     indicatorBaseImage = love.graphics.newImage("recursos/indicator-base.png")
     fuelMeterImage = love.graphics.newImage("recursos/FuelMeter.png")
     playerCar = love.graphics.newImage("recursos/redCar.png")

     carImage = {
          love.graphics.newImage("recursos/blueCar.png"),
          love.graphics.newImage("recursos/greenCar.png"),
          love.graphics.newImage("recursos/yellowCar.png"),
          love.graphics.newImage("recursos/purpleCar.png"),
          love.graphics.newImage("recursos/fuelCar.png")
     }

     --config
     love.graphics.setBackgroundColor(0.80,0.70,0.60)
     scrw = love.graphics.getWidth()
     scrh = love.graphics.getHeight()

     gameOver = false
     maxSpeed = 500
     maxFuel = 60
     roadw = 400
     roadx = scrw * 0.5 - roadw * 0.5
     collision = 0
     indicatorRot = 0
     fuelCarActive = false

     --Tiempo
     seconds = 0
     minutes = 0
     ms = 0

     --carro del jugador
     player = {
          w = playerCar:getWidth(),
          h = playerCar:getHeight(),
          x = 0,
          y = 0,
          accel = 0,
          speedx = 0,
          speedy = 0
     }

     --lineas de la carretera
     line1 = {
          w = 8,
          h = 80,
          x = scrw * 0.5 - 8 * 0.5,
          y = 0,
     }
     line2 = {
          w = 8,
          h = 80,
          x = scrw * 0.5 - 8 * 0.5,
          y = scrh - 80,
     }
     lineDistance = math.abs(line1.y - line2.y)

     --otros carros
     cars = {}
     restartGame()

     --inicia la musica
     musicSound:setVolume(0.06)
     musicSound:setLooping(true)
     musicSound:play()

     --inicial el sonido del motor
     motorSound:setVolume(0.55)
     motorSound:setLooping(true)
     motorSound:play()
     fuelSound:setVolume(0.2)
 end
 
No creo que sea muy difícil  comprender lo que se acaba de hacer, pero daré un resumen. Cargamos los sonidos que en este caso son, la música de fondo, el sonido del motor y el sonido al chocar con el vehículo de combustible. Luego cargamos las imágenes del vehículo del jugador y creamos una tabla con las imágenes de los otros vehículos del juego, cambiamos el color de fondo del la ventana para asemejarse a la arena, y calculamos el ancho y alto de la ventana. Luego otras variables que pienso su nombre lo describe bien. Y las tablas con los valores que representan al carro del jugador, las líneas del la carretera y una tabla "cars" que contendrá a los vehículos que pueden colisionar con el jugador, luego iniciamos los sonidos.
 

Reiniciando el juego

Habrás visto que dentro de la función "load" hay una llamada a la función de nombre "restartGame", en todo juego es necesario crear algo parecido para darle la opción al jugador de volver a empezar la partida. Que hace el código?, pues simplemente vuelve a iniciar los valores que por defecto le diste todas tus variables. Colocamos al jugador y enemigos en sus posiciones iniciales, los temporizadores si los tiene vuelven a cero o al valor que le hayas colocado, en fin todo como debe estar al inicio de tu juego.

--reinicia el juego
function restartGame()
     gameOver = false
     player.x = (scrw * 0.5 - playerCar:getWidth() * 0.5) + 3
     player.y = scrh - 70
     player.accel = 0
     player.speedx = 0
     player.speedy = 0

     line1.x = scrw * 0.5 - 8 * 0.5
     line1.y = 0
     line2.x = scrw * 0.5 - 8 * 0.5
     line2.y = scrh - 80

     ms = 0
     seconds = 0
     minutes = 0

     collision = 0
     indicatorRot = 0
     fuelCarActive = false

     maxFuel = 60

     cars = {}
     for i = 1, 5 do
         addCar()
     end
     motorSound:setPitch(0.4)
     motorSound:play()
end

No me parece muy útil nombrar cada cosa que se realiza en el juego, puesto que se haría bastante extenso, sabiendo que es bastante simple y que sé que puedes entenderlo. Así que te dejaré el código fuente para que lo puedas leer y aprender de él. No se ha usado código complejo ni nada fuera de esta línea de tutoriales que he dado, así que si tienes alguna duda puedes buscarlo en esta página y leerlo para que aclares las dudas, Si quieres también puedes escribirme y tan pronto como pueda te contestaré.
 
Aquí te dejo un video del juego, y bueno te propongo que le agregues algo nuevo o lo modifiques, me gustaría saber como lo has hecho dejándomelo saber en los comentarios. Y eso es todo por ahora hasta la aproxima.

Comentarios