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:
- La estructura básica del código escrito en Lua para Love2D.
- Cargar imágenes, audio y como reproducirlos.
- Manipular nuestro juego con el teclado.
- Colisiones.
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.
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"),
}
--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
Reiniciando 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
Comentarios
Publicar un comentario