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!


Deja tu comentario