Comunidad de diseño web y desarrollo en internet online

Reproducir sonido al desplazar objeto

Citar            
MensajeEscrito el 07 Jun 2012 03:07 pm
Hola a todos;

Estoy intentando crear un reproductor de música que se active (Play) al desplazar un objeto hacia arriba y se desactive (Stop) cuando el objeto se mueva hacia abajo.

Y sinceramente, creo que de tanto darle vueltas me estoy liando mas.

He probado un código, los que viene por defecto en Flash, y aunque parece que funciona es sólo una ilusión, el movimiento lo he conseguido con startDrag/stopDrag, pero el sonido se reproduce/para siempre que hago click y yo quiero que se reproduzca cuando el objeto está arriba y pare cuando no lo esté.

Os pongo el código por si os ayuda.


/* Arrastrar y colocar
Permite que la instancia del símbolo especificado se pueda mover con una acción de arrastrar y colocar.
*/

vinilo_click_drop.addEventListener(MouseEvent.MOUSE_DOWN, fl_ClickToDrag);

function fl_ClickToDrag(event:MouseEvent):void
{
vinilo_click_drop.startDrag(false, new Rectangle(0,-56,0,56));
}
stage.addEventListener(MouseEvent.MOUSE_UP, fl_ReleaseToDrop);

function fl_ReleaseToDrop(event:MouseEvent):void
{
vinilo_click_drop.stopDrag();
}

/* Hacer clic para reproducir/detener sonido
Al hacer clic en la instancia del símbolo, se reproduce el sonido especificado.
Al hacer clic en la instancia del símbolo otra vez, el sonido se detiene.

Instrucciones:
1. Reemplace "http://www.helpexamples.com/flash/sound/song1.mp3" a continuación por la dirección URL del archivo de sonido. Conserve las comillas ("").
*/

vinilo_click_drop.addEventListener(MouseEvent.MOUSE_DOWN, fl_ClickToPlayStopSound);

var fl_SC:SoundChannel;


//Esta variable realiza un seguimiento de las veces que quiere reproducir o detener el sonido
var fl_ToPlay:Boolean = true;

function fl_ClickToPlayStopSound(evt:MouseEvent):void
{
if(fl_ToPlay)
{
var s:Sound = new Sound(new URLRequest("http://www.helpexamples.com/flash/sound/song1.mp3"));
fl_SC = s.play();
}
else
{
fl_SC.stop();
}
fl_ToPlay = !fl_ToPlay;
}

Muchas gracias a todos por vuestra ayuda.

Un saludo

Por Marcos.Ostos

6 de clabLevel



 

chrome
Citar            
MensajeEscrito el 07 Jun 2012 03:25 pm
lo que tienes q hacer es hacer if, con las cordenadas, si es que entendi bien tu idea
tendria q ahcer asi

if(objeto.x > alturaalaquequieroquehagaplay)
{
sonido.play
}
else if(objeto.x < alturaquequieroquehagaplay)
{
soundmixer.stopAll();
}

algo asi, espero aberteayudado.

Por skaterseba

Claber

170 de clabLevel



 

firefox
Citar            
MensajeEscrito el 07 Jun 2012 04:22 pm
Hola skaterseba,

Muchas gracias, sé que tienes razón, al menos el código parece exactamente lo que quiero hacer.
Lo he intentado pero estoy fallando en algo, me puedes decir en que?

Creo que el fallo es que no estoy llamando al sonido correctamente.


import flash.media.Sound;
import flash.media.SoundChannel;
import flash.media.SoundMixer;
/* Arrastrar y colocar
Permite que la instancia del símbolo especificado se pueda mover con una acción de arrastrar y colocar.
*/
var fl_SC:SoundChannel;
var fl_ToPlay:Boolean = true;
var s:Sound = new Sound(new URLRequest("http://www.helpexamples.com/flash/sound/song1.mp3"));

vinilo_click_drop.addEventListener(MouseEvent.MOUSE_DOWN, fl_ClickToDrag);

function fl_ClickToDrag(event:MouseEvent):void
{
vinilo_click_drop.startDrag(false, new Rectangle(0,-56,0,56));
if ( vinilo_click_drop.Y < -56)
{
s.play();
}
else if (vinilo_click_drop.Y > -56)
{
SoundMixer.stopAll();
}
}
stage.addEventListener(MouseEvent.MOUSE_UP, fl_ReleaseToDrop);

function fl_ReleaseToDrop(event:MouseEvent):void
{
vinilo_click_drop.stopDrag();
}

Muchas gracias

Por Marcos.Ostos

6 de clabLevel



 

chrome
Citar            
MensajeEscrito el 07 Jun 2012 05:03 pm
Me fije en uno que habia hecho, cambiandolo por tus variables seria asi:

f ( vinilo_click_drop.Y < -56)
{
fl_SC = s.play();
}

No se que es SoundMixter.stopAll(), nunca use soundMixter, pero te pongo como frenaba yo el audio, para pararlo es:

fl_SC.stop();

y si lo que querias era pausar, guardas en una variable la posicion del marcador antes del stop, ej:

posicion_pista = fl_SC.position;

luego para continuar la reproduccion desde ahi, cuando llamas a play le pasas ese valor, ejemplo

fl_SC = s.play(posicion_pista);

Yo usaba una variable booleana para saber si habia sido pausa o no.

Espero te haya servido.

Saludos!.
Plancha

Por plancha

33 de clabLevel



 

chrome
Citar            
MensajeEscrito el 07 Jun 2012 05:19 pm
proba hacer una varialbe URLREQUEST y asignarsela al sonido sino, proba usar con un sonido metido en tu computadora en la misma carpeta q el archivo.

Por skaterseba

Claber

170 de clabLevel



 

firefox
Citar            
MensajeEscrito el 07 Jun 2012 05:30 pm
Hola Plancha;

Muchas gracias, he hecho lo que me has dicho pero sigue sin funcionar, madre mía que zoquete soy.
Lo malo de esto es que cuando te atoras ya no ves la salida, te copio mi código con tus modificaciones a ver si ves por que no funciona.


import flash.media.Sound;
import flash.media.SoundChannel;
import flash.media.SoundMixer;
/* Arrastrar y colocar
Permite que la instancia del símbolo especificado se pueda mover con una acción de arrastrar y colocar.
*/
var fl_SC:SoundChannel;
var fl_ToPlay:Boolean = true;
var s:Sound = new Sound(new URLRequest("http://www.helpexamples.com/flash/sound/song1.mp3"));

vinilo_click_drop.addEventListener(MouseEvent.MOUSE_DOWN, fl_ClickToDrag);

function fl_ClickToDrag(event:MouseEvent):void
{
vinilo_click_drop.startDrag(false, new Rectangle(0,-56,0,56));
if ( vinilo_click_drop.Y < -50)
{
fl_SC = s.play();
}

else if (vinilo_click_drop.Y > -56)
{
fl_SC.stop();
}
}
stage.addEventListener(MouseEvent.MOUSE_UP, fl_ReleaseToDrop);

function fl_ReleaseToDrop(event:MouseEvent):void
{
vinilo_click_drop.stopDrag();
}

Muchas gracias

Por Marcos.Ostos

6 de clabLevel



 

chrome
Citar            
MensajeEscrito el 07 Jun 2012 07:10 pm
Jaja pasa, una vez postie en el foro porque me tiraba error un addEventListener, y termino siendo un error de tipeo, me queria matar! jaja, pero no lo podia ver al error.

La verdad no veo que haya error, deberia funcionar asi como esta, estas dando bien las cordenadas para que arranque y pare el audio?, veo que los tomaste del new rectangulo, pero no se muy bien como funciona.

Sugerencia, cuando me pasa asi, pruebo de armar uno programa en flash para que haga solo lo que quiero ver si anda, abri otro, pone un boton/simbolo comun y corriente e intenta disparar el sonido con el evento de click a ver si anda, si no funciona ni asi fijate de cambiar el URLRequest.

No te tira ningun error el programa?, porque si no te tirar error ni nada similar para mi hay un problema en la coordenada q le das, pero no puedo asegurarlo porque no entiendo muy bien la sentencia startDrag(false, new Rectangle(0,-56,0,56)), la vez que lo use hice event.target.startDrag, eso de New rectangle y las coordenadas deduzco que creas un cuadrado en las cordenadas que le pasas, pero nunca lo use, mi manera de programar es una mezcla entre estructurada/objetos rarisima jaja (sisi, cero optimizacion).

Espero te ayude, cualquier cosa avisa.

Plancha

Por plancha

33 de clabLevel



 

chrome
Citar            
MensajeEscrito el 07 Jun 2012 08:01 pm
Hola Plancha;

La URL no creo que sea el problema es la que viene por defecto en los fragmentos de codigo de Flash.

Antes de decirte donde creo que está el problema te explico la sentencia de new Rectangle, al menos ya que pido información doy información, que mínimo.

Con la sentencia startDrag (false, new Rectangle (0, -56, 0, 56) lo que consigues es que el Drag sólo se pueda hacer en el eje Y, esto es arriba y abajo, los 0 indican que no se puede desplazar el objeto ni a la derecha ni a la izquierda, el -56 indica que lo puedes desplazar -56 px hacia arriba y el 56 indica que lo puedes desplazar 56 px hacia abajo desde la posición mas alta en este caso -56. Basicamente que desde un punto 0 lo puedes mover 56 hacia arriba.

Y ahora, donde creo que esta el problema, creo que es un problema con la condición, si quito vinilo_click_drop.Y < -50 y pongo fl_ToPlay que es lo que venia por defecto, si suena la música.

De todas formas, si tienes algo parecido, me puedes pegar tu código y hago las modificaciones que necesite?

Muchas gracias por tu ayuda.

Por Marcos.Ostos

6 de clabLevel



 

chrome
Citar            
MensajeEscrito el 07 Jun 2012 08:31 pm
Ahh entiendo!, buena data me tiras, me va a servir en un futuro, gracias!!.

Ahora mas abajo te pego el que hice, pero no se si te va a servir, era muy distinto en la idea, pero igual te lo paso, por ahi te surgen alternativas.

Claro con el booleano te arranca porque esta siempre en true, cada vez que entra al listener lo va a reproducir, lo bueno es que queda descartado el sonido y ahora se sabe que es un tema de la condicion, por lo que insistira en que revises las coordenadas. Aunque como dijimos anteriormente, al estar tan metido a veces cuenta encontrarlo, pero debe ser algun error boludo que se esta pasando por alto.


El codigo que habia usado era asi:



function sonar_1(event:MouseEvent):void
{

if ((buche) && (marcador != 1))
{
detener();
}
buche = true;
marcador_pausa = 1;
var sonido:Sound = new Sound(new URLRequest("musica/dale_bo.mp3"));

if (pausa)
{
channel = sonido.play(posicion_pista);
}
else
{
channel = sonido.play();
}
pausa = false;
}

function sonar_2 (event:MouseEvent):void
{
if ((buche) && (marcador != 2))
{
detener();
}
buche = true;
marcador_pausa = 2;
var sonido:Sound = new Sound(new URLRequest("musica/boca_vida.mp3"));

if (pausa)
{
channel = sonido.play(posicion_pista);
}
else
{
channel = sonido.play();
}
pausa = false;
}

function sonar_3(event:MouseEvent):void
{
if ((buche) && (marcador != 3))
{
detener();
}
buche = true;
marcador_pausa = 3;
var sonido:Sound = new Sound(new URLRequest("musica/desde_cuna.mp3"));

if (pausa)
{
channel = sonido.play(posicion_pista);
}
else
{
channel = sonido.play();
}
pausa = false;
}


function detener():void
{
channel.stop();
pausa = false;
buche = false;
}


function parar_1(event:MouseEvent):void
{
if ((!pausa) && (marcador_pausa == 1))
{
posicion_pista = channel.position;
pausa = true;
marcador = 1;
channel.stop();
}
}

function parar_2(event:MouseEvent):void
{
if ((!pausa) && (marcador_pausa == 2))
{
posicion_pista = channel.position;
pausa = true;
marcador = 2;
channel.stop();
}
}

function parar_3(event:MouseEvent):void
{
if ((!pausa) && (marcador_pausa == 3))
{
posicion_pista = channel.position;
pausa = true;
marcador = 3;
channel.stop();
}
}

Eran 3 botones de play, y 3 de pausa, los de play van a "sonar_" y los de pausa a "parar_".
Todos los eventos eran .CLICK y saque la parte grafica para simpleza de la lectura, asi que si encontras algun btn.x o removeChild que no tiene sentido era del marcador jaja. Si algo no entendes avisame que te lo explico.


Saludos!.
Plancha

Por plancha

33 de clabLevel



 

chrome
Citar            
MensajeEscrito el 07 Jun 2012 09:15 pm
Muchas gracias Plancha,

Sigue sin funcionar pero vamos avanzando, primero darte las gracias porque aprendí a enlazar condicionales, los estaba poniendo mal en vez de ((condicional) && (condicional)) escribía (condicional && condicional).

Ahora parece que medio funciona, si pongo que la posicion de Y es = 0 la música suena pero si pongo <> aparte de que me da error la música no se escucha, voy a seguir probando con las coordenadas.

A ver si lo consigo

Un saludo

Marcos

Por Marcos.Ostos

6 de clabLevel



 

chrome
Citar            
MensajeEscrito el 07 Jun 2012 09:27 pm
Pera pera, porque pusiste "<>"??, si estas queriendo poner "distinto a", aca es !=, proba asi, al menos error no deberia darte. Avisame

Por plancha

33 de clabLevel



 

chrome
Citar            
MensajeEscrito el 07 Jun 2012 09:58 pm
No es que haya puesto <> juntos, si no que si en vez de poner == 0 quiero poner > -56 o <-56 no funciona.
Si al condicional le pongo Y == 0 me da este error:
"TypeError: Error #1009: No se puede acceder a una propiedad o a un método de una referencia a un objeto nulo.
at vinilo_musica_fla::vinilo_2/fl_ClickToDrag()
"
Pero si pongo != 0 la musica suena sin problemas.

Por Marcos.Ostos

6 de clabLevel



 

chrome
Citar            
MensajeEscrito el 08 Jun 2012 01:38 am
Ese error lo suele tirar cuando no esta creado el objeto, o al menos cuando todavia no se creo. Debe ser que da la otra manera te anda porque siempre es distinto de 0. La verdad no se me ocurren mas ideas, si queres te ofrezco que me pases tu .fla con las clases y lo miro, seguramente el error este a la vista y estas tan adentro que lo pasas por alto, me ha pasado muchas veces. Pero la verdad leyendo solamente el codigo ya no se me ocurre donde puede estar el error. Cualquier cosa avisa, exitos!!

Por plancha

33 de clabLevel



 

chrome
Citar            
MensajeEscrito el 08 Jun 2012 11:56 am
Hola Plancha,

Esa idea me parece bastante buena, 4 ojos ven mas que dos.

Como podría enviartelo?

Un saludo y muchas gracias por tu ayuda

Por Marcos.Ostos

6 de clabLevel



 

chrome
Citar            
MensajeEscrito el 08 Jun 2012 11:46 pm
Es una buena pregunta! jaja, no se si el foro permite dejar links de rapidshare o similar por aca, pero te mando mi mail por mensaje privado y listo, me lo adjuntas o me pasas un link de donde descargarlo, lo unico aviso que seguramente no pueda verlo hasta el domingo, mañana es un dia bastante complicado para mi, si puedo buenisimo, sino sera el domingo, aviso por las dudas.

Por plancha

33 de clabLevel



 

chrome

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.