El sonido es un elemento imprescindible en un juego, por muy buenos que sean los gráficos. Si no ponemos música de fondo y efectos de sonido a las acciones y eventos el juego estará incompleto.
Afortunadamente incorporar sonido a nuestros juegos es una de las tareas más sencillas de implementar.
En la ultima entrada añadimos armamento a nuestra nave, ¡pongamos sonido a esos lasers!
Descarga los fuentes de esta entrega aquí
Efectos de sonido
Recuerdas que habíamos creado la Tabla laserblue01 con la info del laser? vamos a cargar el efecto de sonido. Para ello añade la siguiente linea en la función xloadobjs( ):
laserblue01.sound=love.audio.newSource("recursos/Bonus/sfx_laser1.ogg", "static")
Con eso ya tenemos cargada la fuente de sonido. El primer parámetro es la ruta al archivo de audio, en el segundo parámetro, ponemos «static».
Si al cargar una fuente de audio le indicamos que es «static» el juego la cargará en memoria, siendo más eficiente la ejecución. Se utiliza para efectos de sonidos y audios en general de corta duración.
Si vas a cargar música por ejemplo omite el parámetro.
Ahora vamos a indicar cuando hacer sonar el disparo.
Como tenemos nuestra función de disparo xplayershoot() que se ejecuta cada vez que el jugador dispara. Únicamente añadimos las siguientes lineas al final de dicha función:
-- reproduce sonido laser
laserblue01.sound:stop()
laserblue01.sound:play()
Ahora cada vez que disparemos sonará el láser! Fácil verdad??
Mientras un sonido se está reproduciendo no puede volver a iniciarse. Por eso, es buena idea detener el sonido justo antes de iniciarlo. Si no estuviera sonando simplemente no hace nada. para detenerlo se utiliza :stop()
¿Pero que pasa si quiero añadir música?
Música
Para añadir música hacemos lo mismo, cargamos la fuente:
background.sound=love.audio.newSource("recursos/musica/space1.mp3")
Y simplemente la iniciamos al principio especificando que se repita en bucle. También es conveniente que la música suene sin tapar los eventos del juego. Añade las siguientes lineas al final de la función love.load():
background.sound:setVolume(0.4) -- 40% del volumen general
background.sound:setLooping(true)
background.sound:play()
Y eso es todo en lo que respecta al audio!
El código completo queda así:
function xInit()
print("altaruru intro a love2d")
print("ESCAPE TO QUIT")
-- recupera dimensiones de la ventana
WINDOWH = love.graphics.getHeight()
WINDOWW = love.graphics.getWidth()
end
function xloadobjs()
background = {}
background.image = love.graphics.newImage('recursos/Backgrounds/clouds.png')
background.W = background.image:getWidth()
background.H = background.image:getHeight()
laserblue01 = {}
laserblue01.image = love.graphics.newImage("recursos/PNG/Lasers/laserBlue01.png")
laserblue01.W = laserblue01.image:getWidth()
laserblue01.H = laserblue01.image:getHeight()
laserblue01.sound=love.audio.newSource("recursos/Bonus/sfx_laser1.ogg", "static")
background.sound=love.audio.newSource("recursos/musica/space1.mp3")
background.sound:setVolume(0.4) -- 40% del volumen general
background.sound:setLooping(true)
background.sound:play()
player1 = {}
player1.image = love.graphics.newImage("recursos/PNG/playerShip1_blue.png")
player1.W = player1.image:getWidth() -- ancho de la nave
player1.H = player1.image:getHeight() -- alto de la nave
player1.x=(WINDOWW-player1.W)/2 -- posicion inicial x
player1.y=WINDOWH-player1.H-40 -- posicion inicial y
player1.v = 300 --velocidad de la nave
-- tabla lasers
player1.lasers={}
end
function love.load()
xInit()
xloadobjs()
end
function love.draw()
-- Draw background
love.graphics.setColor(255, 255, 255)
love.graphics.draw(background.image, 0, 0, 0, WINDOWW/background.W, WINDOWH/background.H)
-- Draw player
love.graphics.draw(player1.image, player1.x, player1.y)
-- Draw lasers
for _,l in pairs(player1.lasers) do
love.graphics.draw(laserblue01.image, l.x, l.y)
end
end
function xmoveplayer(x, y, dt)
player1.x = player1.x + (x * player1.v * dt)
end
function xmovelasers(dt)
for ldel, laser in ipairs(player1.lasers) do
if laser.y > -5 then
laser.y= laser.y - 500 * dt
else
-- si llega a la parte superior de la ventana se elimina
table.remove(player1.lasers, ldel)
end
end
end
function xplayershoot()
laser={}
laser.x= player1.x + (player1.W/2) - (laserblue01.W/2)
laser.y= player1.y - laserblue01.H
table.insert(player1.lasers, laser)
-- reproduce sonido laser
laserblue01.sound:stop()
laserblue01.sound:play()
end
function love.update(dt)
if left_down then
xmoveplayer(-1,0,dt)
end
if right_down then
xmoveplayer(1,0,dt)
end
xmovelasers(dt)
end
function love.keypressed(key)
if key == 'left' then
left_down = true
elseif key == 'right' then
right_down = true
end
if key == " " then
xplayershoot()
end
if key == "escape" then
love.event.quit()
end
end
function love.keyreleased(key, unicode)
if key == 'left' then
left_down = false
elseif key == 'right' then
right_down = false
elseif key == " " then
space_down = false
end
end
function love.quit()
print("¡Hasta pronto!")
end
Si necesitas recursos uno de los mejores sitios es OpenGameArt, el archivo de música puedes descargarlo aquí
Próxima entrada, jugando con el azar, números aleatorios.
Feliz código!