Es el momento de añadir sonido a nuestros proyectos. Todo juego necesita sonido y ahora veremos como se hace en Lua. Empecemos.
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.
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.
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!!!
Comentarios
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
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
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
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
muy facil
presiona AltGr y la tecla + que esta pegadita al enter y listo
mira ~~~~~~~~~~~~~~
saludos
no funciona
no funciona el metodo que me dijiste
mira:
nada
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. &
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.
gracias
muchas gracias ZYX3D
ahora ya no tengo que pegar una y otra vez
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. &
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 ;)
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.
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.
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
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
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
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
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.