Problema técnico con AS3
Buenas noches a todos.
Estoy programando una serie de juegos en as3 con flash cs4 en los cuales necesito hacer variaciones de sonidos y volúmenes muy rápidos, y sorpresa la mía cuando la máquina virtual de flash parece flojear técnicamente cuando se la presiona un poquito.
El caso es que al variar ràpidamente el volumen de un sonido cargado se oye un claqueteo muy incómodo por los bafles y que hace el producto final una chapuza.
Lo he probado en varios equipos pero nada, parece ser flash.
Quizás estoy haciendo algo mal o al alguien se le ocurre alguna idea para solucionarlo, cosa que agradecería en el alma para no tirar días de trabajo a la basura.
Muchas gracias.
Un código simple que os mostrará el problema sería por ejemplo este:
var snd:Sound = new Sound();
snd.load(new URLRequest("cancion.mp3"));
var trans:SoundTransform=new SoundTransform(1, 0);
var canal:SoundChannel = snd.play(0, 1, trans);
canal.addEventListener(Event.SOUND_COMPLETE, onPlaybackComplete);
addEventListener(Event.ENTER_FRAME, onEnterFrame);
var contador:Number = 0;
var vol_varia:Number;
function onEnterFrame(event:Event):void {
contador += 0.2;
vol_varia=Math.sin(contador);
if(vol_varia>0){trans.volume = Math.sin(vol_varia);}else{contador+=22;}
canal.soundTransform = trans;
}
solonova
Nada, ni con Timer ni con tweenlite, hace el mismo craqueteo al variar ràpidamente el volumen o balance de un sonido.
Qué desesperante. Lo más cachondo es que con Flash MX no pasa, pero se me queda corto el vm1 en otros aspectos.
Me pregunto que hubiera pasado si Macromedia hubiera continuado programando las siguientes versiones de Flash, por que desde luego Adobe se está luciendo.
Gracias a todos.
solonova
Muchísimas gracias plastikaweb y Ochionet.
No conozco la librería tweenlite, la investigaré.
Buen consejo lo del timmer en vez de enterframe
Gracias de nuevo, probaré y comentaré con los resultados.
ochionet
hola solonova. creo que entiendo lo que quieres, simplemente necesitas un reproductor de archivos mp3 externos al que puedas bajar el volumen cuando quieras. Yo lo que haría sería crear una clase que fuera reproductor al cual le informes del mp3 que debe reproducir.
La clase lo que haría es cargar el mp3 y por medio de metodos publicos reproducirlo y bajar el volumen. Si sólo quieres que se reproduzca 1 vez, cuando acabe de reproducirse el sonido, puedes introducir un dispatchEvent que avise a la clase que creo el objeto que el sonido ya ha acabado y que puede borrar el objeto que ha disparado el evento. Cada sonido será un objeto diferente e independiente por lo que tendrás control sobre ellos, sabiendo en todo momento la cantidad de sonidos que existen.
Otra cosa es como bajas el volumen, el volumen va de 0 (silencio) a 1 (volumen máximo) por lo tanto podrás bajar el volumen por medio de un timer / enterframe modificando el valor de trans.volume bajando su valor 0.1 cada vez, si utilizas un enterframe la velocidad de bajada te la marcará los fps de la película principal, si lo haces con un timer tendrás más control en cuanto al fade que quieres que haga el sonido. Puedes hacer que cuando trans.volume sea igual a 0 dispare el mismo dispatchEvent que te comentaba antes dado que el sonido aunque pueda que siga reproduciendose ya no tenga sentido que exista por que su volumen es 0.
Intenta simplificarlo, quieres que se reproduzca un sonido nuevo, creas el objeto y le dices reproducete, que acaba, avisa que ha acabado y se borra, que mientras se esta reproduciendo quieres eliminarlo, le dices que se baje el volumen, y cuando el volumen sea 0 que avise que ha acabado y se borre.
otra cosa que puedes hacer es cargar todos los sonidos en objetos diferentes en el arranque y mantenerlos en memoria pausados, solo le dirás a cada uno que se reproduzca cuando lo necesites, y que no se borren cuando acaben, asi estarán preparados para reproducirse cuando los necesites. Recuerda que si haces esto, deberas de inicializar el volumen de cada sonido cada vez acabe de bajarse, para que este preparado para la siguiente vez que lo necesites.
Saludos,
plastikaweb
A bote pronto y sin probar tu código se me ocurre que tal vez puedas hacer una prueba, en lugar de transformar el volumen con el enterframe, puedes utilizar una libreria como tweenlite, sólo añades unos 4kbs al swf y por probar...
solonova
Gracias dourado.
Aunque sigo con el problema, y es necesario que carguen mp3 externos.
dourado
BuenAS solonova,
No tengo praticamente ninguna experiencia aparte de hacer un pequeño player de musicas en mp3..solo como nota... el sonido a que te refieres pasa por ser en mp3...
El mp3 tiene esa pega cuando se trabaja en flash... pero no sé decirte si lo puedes resolver cargando wav o ai...
Si es un juego prueba de meter los sonidos en swf's y controlarlos como si fueran animaciones...en plan frame 1 vazio e frame 2 con la musica/sonido que quieras y así los puedes preloader y ir controlando...
Suerte, saludos!
solonova
Nadie puede echarme un cable?