Anuncios Google

9. Sonidos y musica

Tutoriales Avanzados Homebrewes

Es el momento de añadir sonido a nuestros proyectos. Todo juego necesita sonido y ahora veremos como se hace en Lua. Empecemos.

Aplicando sonido

LuaPlayer puede reproducir los siguientes formatos: UNI, IT, XM, S3M, MOD, MTM, STM, DSM, MED, FAR, ULT o 669 para música. Los archivos WAV pueden usarse para sonido. Es posible convertir archivos MIDI a alguno de los formatos anteriormente mencionados. Un programa que puede hacerlo es Modplug Tracker. Ten presente que LuaPlayer no soporta archivos MP3.

Después de aprender unos pocos comandos de sonido los aplicaremos junto a lo aprendido anteriormente para crear un pequeño programa.

Miremos el primer comando, el cual reproducirá un archivo de música:

Musica.playFile(nombre_archivo, bucle_infinito)

En nombre_archivo pondrás el nombre del archivo que quieras reproducir, por ejemplo cancion.xm. En bucle_infinito pondrás true (verdadero) o false (falso). True reproducirá la canción una y otra vez y false sólo una vez. Ej:

Musica.playFile("miCancion.mod", true)

Ahora miremos los siguientes comandos, que pueden usarse una vez iniciada la reproducción del archivo de música:

Musica.pause()
Musica.stop()
Musica.resume()

El primero pausará la canción, el segundo parará la canción y el último volverá a reproducir la canción si la has parado temporalmente.

También hay un comando que puede usarse para comprobar si una canción se está reproduciendo o no. Devolverá true (verdadero) o false (falso):

Musica.playing()

Supongamos que queremos probar si nuestra canción se está reproduciendo y si es así entonces mostraremos un mensaje por pantalla. Podemos hacer:

if Musica.playing() == true then
screen:print(10,10,"La musica esta sonando",blanco)
end

También hay un comando para ajustar el volumen del archivo de música. Dentro del paréntesis simplemente pon un número entre 0 y 128:

Musica.volume(numero)

Ahora aprendamos un poquito más sobre archivos de sonido para usarlos como efectos de sonido, concretamente los archivos WAV. El uso es un poco diferente a lo que acabamos de ver. Así es como se carga un sonido:

miSonido = Sound.load("miSonido.wav",false)

El archivo WAV se carga en una variable que más tarde podremos usar para referirnos al sonido. Usamos false para que no suene una y otra vez. Si usásemos true haríamos un bucle, si es lo que necesitas.

Algo muy importante respecto a los archivos WAV en Lua es que deben ser mono y no stereo. Puedes comprobar si un archivo es mono o stereo pinchando con el botón derecho del ratón sobre el archivo, elegir propiedades y luego resumen, ahí lo pone.

El siguiente comando reproducirá el archivo. Usa el nombre de la variable en la que has cargado el sonido. Ej:

miSonido:play()

No recomiendo usar esta forma de reproducir el archivo porque puede conducir a un error muy común, el cual muestra el mensaje loop ingettable. Así es como yo reproduzco mi archivo. Lo único que necesitarás cambiar en el código es:

local sonido = miSonido
voz = sonido:play()

Para detener el sonido:

voz:stop()

También podemos usar un comando para saber si el sonido se está reproduciendo, al igual que con la música:

voz:playing()

Hay más comandos para los sonidos y la música, por si quieres mirarlos, pero éstos son suficientes para manejarnos.

Pongámoslo en práctica

hora vamos a crear un pequeño programa. Empezará en una pantalla de menú donde seremos capaces de seleccionar un fondo azul o negro. Cuando presionemos la X, el programa pasará a la siguiente pantalla con el color de fondo que hayamos seleccionado y mostrará cuantas veces el programa ha sido ejecutado. Bien, cada vez que presionemos la X en la pantalla del menú, se abrirá un archivo que crearemos en breve y escribirá un número en él. El programa también necesitará leer el número del archivo y almacenarlo en una variable. Si sales completamente del programa y posteriormente vuelves a iniciarlo, seguirá mostrando cuantas veces se ha iniciado, ya que está almacenado en un archivo. Vamos allá.

Lo primero que vamos a hacer es crear un fichero de texto normal con el bloc de notas o con cualquier programa que uses. Dentro del archivo de texto escribe el número 0. Salva el contenido con el nombre contador.txt.

Empecemos con el fichero script.lua. Primero crearemos objetos color que usaremos posteriormente:

blanco = Color.new(255,255,255)
azul = Color.new(0,0,255)
negro = Color.new(0,0,0)

Ahora algunas variables:

oldpad = Controls.read()
colorInicio = negro
estadoJuego = "menu"

olpad almacenará el último botón que hayamos pulsado; colorInicio guarda el color que usaremos en la siguiente pantalla, empezaremos con el negro; estadoJuego lo usaremos para ver qué función usar. Haremos dos funciones, una lanzará el menú y la otra lanzará el resto del programa. El valor inicial es menu porque nuestro juego empezará mostrando un menú.

Lo próximo es utilizar sonidos. Descarga estos dos pequeños archivos WAV a la carpeta donde tengas el programa.

Beep y Goodbye

Carguemos esos archivos WAV en nuestro programa. No queremos que se reproduzcan indefinidamente, por lo que usaremos false.

sonidoMenu = Sound.load ("beep.wav",false)
adios = Sound.load("goodbye.wav",false)

Es muy sencillo. Llegados a este punto abriremos nuestro archivo contador.txt, leeremos el valor que contiene y lo guardaremos en la variable contador.

archivo = io.open("contador.txt", "r")
contador = archivo:read("*n")
archivo:close()

Fíjate que usamos "*n" para leer un número.

Ahora crearemos una tabla para nuestra pantalla inicial, que contendrá una imagen que creamos para usarla como selector, así como sus valores x e y (coordenadas).

selector = { imagen = Image.createEmpty(145,15), x = 147,y = 77 }
selector.imagen:clear(azul)

Ahora crearemos una función llamada dibujaMenu() que realizará todas las tareas necesarias del menú. Este es su encabezado:

function dibujaMenu()

Usaremos esta función para limpiar la pantalla y leer los controles en cada bucle. Añade este código:

screen:clear()
pad = Controls.read()

Ahora vamos a mostrar nuestro selector en la pantalla e imprimir dos líneas de texto:

screen:blit(selector.x,selector.y,selector.imagen)
screen:print(150,80,"Iniciar Juego (Negro)",blanco)
screen:print(150,100,"Iniciar Juego (Azul)",blanco)

Fíjate cómo hemos usado los valores de nuestras tablas para mostrar el selector en pantalla. La imagen del selector se moverá arriba y abajo para resaltar la opción de menú seleccionada. Nuestras dos líneas de texto mostrado serán las opciones del menú, empezamos el juego con una pantalla negra o una azul.

Nuestras siguientes secciones dentro de la función comprobarán los botones que presionemos:

if pad:up() and oldpad:up() ~= pad:up() then
selector.y = 77
colorInicio = negro
local sonido = sonidoMenu
voz = sonido:play()
end

Este trozo de código dice que si presionamos arriba y si arriba no fue el último botón presionado entonces ponemos el valor "y" del selector a 77. Hacemos esto para superponer la imagen sobre el texto para que parezca que está seleccionado. A continuación ponemos el color de inicio en negro y reproducimos el sonidoMenu.

Ahora para el botón abajo. Se hace exactamente igual excepto que pondremos la imagen un poco más baja y pondremos el color en azul:

if pad:down() and oldpad:down() ~= pad:down() then
selector.y = 97
colorInicio = azul
local sonido = sonidoMenu
voz = sonido:play()
end

Ahora para el botón X:

if pad:cross() and oldpad:cross() ~= pad:cross() then
estadoJuego = "juego"
contador = contador + 1
archivo = io.open("contador.txt","w")
archivo:write(contador)
archivo:close()
end
end

Hemos puesto el estado de juego en juego para que el código del menú no se siga ejecutando. Incrementamos la variable contador en 1. Abrimos nuestro fichero TXT y escribimos el nuevo valor del contador, reemplazando el valor anterior. Cerramos el archivo y el último end cierra la función.

En la siguiente función vamos a escribir el resto del juego después de que dejemos el menú. Esta función es pequeña y sencilla, por lo que la pongo completa:

function iniciarJuego()
screen:clear(colorInicio)
pad = Controls.read()
 
screen:print(100,100,"Este programa ha sido iniciado " .. contador .. " veces.",blanco)
screen:print(100,110,"Pulsa Start para salir al Menu",blanco)
 
if pad:start() then
estadoJuego = "menu"
local sonido = adios
voz = sonido:play()
end
end

En esta función hemos limpiado la pantalla con el color que hemos seleccionado en el menú usando la variable colorInicio. Se muestran dos mensajes y se comprueba el botón Start, si es pulsado estadoJuego pasará a menu y sonará el archivo WAV.

Ahora empezaremos nuestro bucle principal. Es muy corto y sencillo gracias a nuestras funciones. En el bucle comprobaremos en qué estado está el juego y ejecutaremos la función para ese estado:

while true do
 
if estadoJuego == "menu" then
dibujaMenu()
end
 
if estadoJuego == "juego" then
iniciarJuego()
end
 
screen.flip()
oldpad = pad
end

Pruébalo!!!

4.57143
Tu voto: Ninguno Votos totales: 4.6 (14 votos)

Anuncios Google

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de NauTiluS1

HELP ME PLEASE

quisiera que me ayudaran ps miren

 

if pad:cross() and mActual == 1 then

dofile("ms0:/PSP/GAME/LUAplayer/X.lua")

end
                        Quisiera que cuando le de a la X para que se ponga el juego suene la cancion y no pare de sonar lo que es el bucle true, pero nose como poner la cancion.

 

tambien quisiera saver que como hago para que cada ves presione el boton arriba o abajo suene un sonido.


Follow me twitter nautilus1_jmccu!!
Sony, ya a nadie le interesa tus UMD si alguien compra una psp es por nosotros los coders. Madura y has un FW que haga la diferencia y anime a las personas en comprar un PSP

Imagen de scorpion56

disculpen mi ignorancia

disculpen mi ignorancia cual es el comando que sirve para cuando presiones un boton se escuche un sonido no se si me explico

arriba= sonido1

abajo=sonido2

etc ya le he buscado y no encuentro slucion no se si me podrian ayudar


 

Imagen de yamishi

ayuda otra vez

creo que me he equivocado en algo porque el luaplayer de mi psp ni el de mi pc lo quieren abrir porfavor ayuda aqui esta el link de descarga de megaupload

http://www.megaupload.com/?d=YJOU7JJJ

y aki esta un screenshot del error que me da en el luaplayer de mi psp

http://www.megaupload.com/?d=ILQLYDY6

EDITADO: Enlace desviado hacia "nueva ventana/pestaña" al tratarse de otra web, por favor, revise las normas de edición. Gracias. arima_kun


 

Imagen de yamishi

ayudaaaaaaaaaaaaa para un ignorante

hola

estos tutos estan geniales

oerdon por mi ignorancia pero como se pone el caracter:~

he tenido que estar copiandolo y pegandolo


 

Imagen de arima_kun

muy facil

presiona AltGr y la tecla + que esta pegadita al enter y listo

mira ~~~~~~~~~~~~~~ 

saludos

Imagen de yamishi

no funciona

no funciona el metodo que me dijiste

mira:

nadaCry

Imagen de arima_kun

pues a mi si

y ya lo probe en el notepad++ por si cambiaba

no se que puedas estar haciendo mal 

presionas la tecla correcta? es la que esta junto al acento y tiene tres simbolos 

si la presionas sola sale: +

con shift: *

con AltGr: ~


Te gusta el DjMax visita mi canal en youtube

No respondo dudas por mensaje privado,  usa los foros. &

Imagen de ZYX3D

Alt+126

Hay que tener en cuenta que no todos los teclados son iguales (y por eso me refiero al juego de carácteres, o a la asociación tecla-carácter). De hecho, arima_kun, en el lugar que tú dices, yo estoy acostumbrado a ver no la tilde ~ sino el cierre de corchete ], que si no me equivoco es el estándar en España.

Una manera alternativa (y que funciona con cualquier disposición de teclado en Windows) es apretar la tecla Alt y, sin soltarla, escribir 126 con el teclado numérico.

 


Strength is irrelevant. Resistance is future. We wish to improve ourselves.

La fuerza es irrelevante. La resistencia es futuro. Queremos mejorarnos.

Imagen de yamishi

gracias

muchas gracias ZYX3D

ahora ya no tengo que pegar una y otra vez

Imagen de arima_kun

muy bueno

yo pense que la disposicion de teclas solo cambiaba entre sitemas operativos

como en linux que luego me cuesta encontrar hasta los simbolos mas sencillos

tampoco tenia en cuenta que cambia el diseño de los teclados XD

saludos y decirte que he visto muchos de tus post y me sorprende el conocimiento que tienes en muchos temas, me sorprende


Te gusta el DjMax visita mi canal en youtube

No respondo dudas por mensaje privado,  usa los foros. &

Imagen de jjdrako

aprendo aprendo

me estan gustando tus tutoriales elender, la verdad que aprendo mucho sobre este lenguaje, quiero indicar que yo tengo el ultimo luaplayer para windows v020 y si oigo los sonidos, queria indicar tambien dos cosas

1º que diferencias puede haber entre reproducir un archivo como musica o como sonido, porque el wav deja solo como sonido o tambien como musica de fondo

2º en la explicacion del tutorial no has puesto screen.waitVblankStart(), aqui no importa ponerlo??

un saludo
y gracias por los tutos ;)


Imagen de ELeNDeR

Pensandolo un poco puedo

Pensandolo un poco puedo llegar a imaginar por qué un archivo WAV no es bueno para música y sí para sonidos. El formato WAV no está comprimido y una canción en WAV (para ponerla como música de fondo de tu juego) puede ocupar mucho (depende de las frecuencias que utilices), por eso no es óptimo. Pero vamos, que esto es un pensamiento mío, no es una verdad absoluta. Saludos.


Imagen de ELeNDeR

Los tutoriales no son míos,

Los tutoriales no son míos, simplemente los traduje de esta web. Creo que a la mayoría de tus preguntas encontrarás respuesta allí, eso sí, en inglés. Siento no poder ayudarte más pero no tengo mucha experiencia con este tipo de lenguaje interpretado. Saludos.


Imagen de jjdrako

encuanto a la musica

OK, encuanto a la musica con que programas paso las canciones mp3 a esos unicos formatos??? tengo varios programas de conversion de sonido pero en ninguno me salen esos

edit1: no he dicho nada esta justo arriba del todo :|
edit: cual es recomendable?? porque si en la musica hablan o algo asi?? desaparecera no??, si no tendre cargarlo como sonido que deja wav


volumen

Ey, ¿el comando del volumen de la música es el mismo para los efectos de sonido? es que el luaplayer de la psp dice no se que de error en el comando de volumen...

limite wav

¿Existe algún tipo de limite a la hora de reproducir un .wav ya sea en tiempo o en KBytes?

Estoy intentado reproducir un .wav de 1 minuto y solo se reproduce un par de segundos

Gracias

Imagen de ELeNDeR

La única limitación que yo

La única limitación que yo conozco respecto a los wav en Lua es que tienen que ser Mono y no Estéreo. ¿Has comprobado que el wav que quieres reproducir sea Mono?

Parece que si

El archivo wav es Mono.

He estado mirando en foros y he hecho algunas pruebas y parece ser que hay alguna limitacion en el tamaño del archivo a reproducir. No se decirte con exactitud dicho limite

Imagen de ELeNDeR

Si me lo dijeras

Si me lo dijeras exactamente lo podríamos añadir al tutorial.

tutorial en mal estado, no

tutorial en mal estado, no se ejecuta el codigo con el lua player windows, da un error

Imagen de ELeNDeR

No creo que el luaplayer

No creo que el luaplayer para Windows pueda reproducir archivos de audio. Pruebalo directamente en la PsP y seguro que funciona.


Descargar Homebrew de BETA, gratis. Visualizar un tutorial, gratis. Iniciarse en la programacion en español, gratis. Colaborar a que la scene PSP en español crezca, no tiene precio.

reproduccion wav

¿Hay alguna manera de reproducir una parte de un archivo .wav usando como información el tiempo de inicio y el de final?

Enhorabuena por la pagina en general, estais haciendo un gran trabajo, y los tutoriales son muy buenos, muy bien comentados.

Gracias

Imagen de ELeNDeR

Sí, en el siguiente

Sí, en el siguiente tutorial se explica la utilización de temporizadores. Si los utilizas junto al sonido:play() y sonido:stop() podrás conseguir lo que quieres.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.