Comunidad de diseño web y desarrollo en internet online

Problema: cambiar entre varios sonidos con el objeto Sound.

Citar            
MensajeEscrito el 19 Ago 2012 05:47 pm
Saludos:
Estoy usando el objeto Sound dentro de una clase creada por mi para la musica de fondo de un sitio. Todo funciona y muy bien por suerte, excepto que cada seccion del sitio debe tener una musica de fondo diferente. En la clase, ademas del clasico MovieClip que contiene el "Play/Stop" hay dos clips mas que contienen lineas, una en cada clip. Estas lineas actuan para mostrar una especia de vumetro (equalizador) que se ajusta al ritmo de la musica. Perdon por no ser mas claro, pero no se como llamarles, si vumetro o equalizador a esas lineas.
El problema es que cuando cambio de opciones del menu, la musica cambia pero los clips que se muestrar junto a la musica se van encimando, uno arriba del otro.
Paso a dejar el codigo, primero el de la clase "SonidoMP3":

Código ActionScript :

public class SonidoMP3 extends Sprite
   {
      private var mp3:String;
      private var snd:Sound;
      private var req:URLRequest;
      private var izq:MovieClip = new CanalIzq_mc();
      private var der:MovieClip = new CanalIzq_mc();
      private var botonSnd:MovieClip = new StopPlay_btn();
      private var canal:SoundChannel = new SoundChannel();

      public function SonidoMP3(mp3)
      {
         snd = new Sound();
         req = new URLRequest(mp3);

         snd.load(req);
         izq.name = "izquerda";
         der.name = "derecha";

         SoundMixer.stopAll();
   
         izq.width = 1;
         der.width = 1;

         canal = snd.play();

         izq.x = 873.25;
         izq.y = 667.35;
         addChild(izq),
         der.x = 873.25;
         der.y = 670.10;
         addChild(der);

         botonSnd.x = 840;
         botonSnd.y = 670;

         addChild(botonSnd);
         botonSnd.buttonMode = true;
         botonSnd.addEventListener(MouseEvent.CLICK, alClick);

         function alClick(e:MouseEvent):void
         {
            if (botonSnd.currentFrame == 1)
            {
               botonSnd.gotoAndStop(2);
   
               canal.stop();
            }
            else
            {
               botonSnd.gotoAndStop(1);
               canal = snd.play();
            }
         }
         addEventListener(Event.ENTER_FRAME, EnterFrame);

         function EnterFrame(event:Event):void
         {
            izq.width = (Math.round(canal.leftPeak * 100));
            der.width = (Math.round(canal.rightPeak * 100));
         }

      }

   }


Ahora el codigo de la linea de tiempo donde llamo la funcion que pasa el tema musical a la clase.

Código ActionScript :

function alClick(e:MouseEvent):void
   {
   
      var lp:LunaProgreso = new LunaProgreso();
      if (n==1)
      {
         ldr.load(new URLRequest("bio.swf"));
         sonidoFondo("./mp3/****.mp3");

      }
      else if (n == 2)
      {
         sonidoFondo("./mp3/****.mp3");
      }
      else if (n == 3)
      {
         ldr.load(new URLRequest("videosc.swf"));
         //subFotos();   
         sonidoFondo("./mp3/****.mp3");
      }


Y por ultimo, la funcion "sonidoFondo":

Código ActionScript :

function sonidoFondo(musica:String)
{
   var sonido:SonidoMP3 = new SonidoMP3(musica);
   addChild(sonido);
}


La variable "sonido" fue declarada al comienzo, pero no lo agregue aqui por creer que no seria necessario.
Si alguien puede darme algun consejo, le estare mas que agradecido. Imagino que el "addChild" que se encuentra en la funcion "sonidoFondo" es el que agrega los clips en cada llamada, pero si lo saco no entra a la clase. No se que puedo hacer.

Muchas gracias
STARLANCER :wink:

Por starlancer

59 de clabLevel



 

msie
Citar            
MensajeEscrito el 21 Ago 2012 06:41 pm
No entiendo la pregunta

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 22 Ago 2012 02:22 pm
Perdon por no saberme explicar, intentare ser mas resumido y claro.
Tengo un clip para detener e iniciar el sonido (Play/Stop). En el clip tengo dibujado en el primer frame el recuadro para simbolizar Stop, en el segundo frame para simbolizar el Play. El clip es añadido dentro de la clase SonidoMP3.
Cada opcion del menu principal de la pelicula, lleva a una seccion diferente. Entonces, para cada seccion el sonido de fondo es distinto. Una musica para cada seccion.
El tema es que cuando selecciono las diferentes opciones, el clip de Play/Stop se superpone. Es decir que llega un momento en que cuando se pulsa sobre el clip con el simbolo de Stop, no se distingue el cambio al simbolo de Play porque estan los clips encima. Es como si se creara cada vez que llamo a la clase. Quizas sea ese el problema, los addChild que hay dentro de la clase.

Perdon por no explicar mejor pero no se como puedo aclarar mas el problema.

Muchas gracias
STARLANCER :wink:

Por starlancer

59 de clabLevel



 

msie
Citar            
MensajeEscrito el 22 Ago 2012 05:21 pm
Haz un removeClip antes de el addChild del siguiente, o mejor aún, reutiliza el mismo player en vez de reinstanciar uno nuevo cada vez

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

chrome
Citar            
MensajeEscrito el 22 Ago 2012 06:21 pm
¿Podrias ayudarme en como podria reutilizar la clase sin instanciarla con cada click?.
Gracias nuevamente
STARLANCER :wink:

Por starlancer

59 de clabLevel



 

msie
Citar            
MensajeEscrito el 22 Ago 2012 06:31 pm
Soy muy vago para escribir codigo, pero se me ocurre una primera cosa que puedes intentar, en vez de cargar el MP3 en el constructor, agrega un método público que sea playMusic por ejemplo, entonces lo instancias y llamas a ese método para cargar la música (que ya lo estas haciendo, es solo crear un método) Luego cuando cambias de tema, en vez de instanciar de nuevo la clase simplemente llamas al metodo playMusic que va a cambiar el MP3

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

chrome
Citar            
MensajeEscrito el 22 Ago 2012 06:39 pm
Jajajaja... perdon por lo vago. El tema es que estoy migrando a AS3, y produce "migrañas" tambien. Se me complica en como utilizar las clases y en los cuando utilizarlas.
Muchisimas gracias por tu ayuda, la voy a poner en practica. Espero poder solucionar este tema.
Gracias
STARLANCER :wink:

Por starlancer

59 de clabLevel



 

msie
Citar            
MensajeEscrito el 24 Ago 2012 06:35 pm
Hola de nuevo:
He intentado el consejo de Jorge, pero no me ha salido. Quise crear un metodo publico, despues de donde tengo inicializada la variable "req" en la clase, pero me sale el eror que "url no debe ser nulo".
¿Alguien tednria algun ejemplo de como hacer un metodo publico para hacer referencia a este en vez de inicializar el constructor?.
Muchas gracias y disculpen la molestia
STARLANCER :wink:

Por starlancer

59 de clabLevel



 

msie
Citar            
MensajeEscrito el 24 Ago 2012 06:45 pm
Sería

Código ActionScript :

public function loquesea(uri:String):void{
  //....
}


Y luego lo llamas a traves de la instancia

Código ActionScript :

miPlayer.loquesea("path al archivo")


Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 26 Ago 2012 05:04 pm
Pero, si agrego el metodo dentro de public function SonidoMP3, de sale el error que "el atributo public se utiliza dentro de un paquete". Y si lo agrego fuera del constructor, al inicializarla me dice que hay dos.
Perdon por ser tan burro, pero el cambio a objetos me esta costando muchisimo.
Para inicializar es igual que siempre, ¿verdad?, es decir:

Código ActionScript :

var sonido:SonidoMP3 = new SonidoMP3


Mil disculpas si las preguntas son muy tontas.
Gracias
STARLANCER :wink:

Por starlancer

59 de clabLevel



 

msie
Citar            
MensajeEscrito el 27 Ago 2012 02:09 pm
Ya funciona, no te entendia bien como hacerlo pero ya esta. Funciona bien. Me aparecio otro problema, en vez de detener el sonido cuando hago click en el clip para detenerlo, arranca de nuevo. Pero sera pregunta para otro post en caso que no encuentre yo mismo la solucion.
Gracias Jorge por estar siempre resolviendo mis problemas, me han servido siempre tus consejos y me has sacado de muchisimos apuros....gracias.
STARLANCER :wink:

Por starlancer

59 de clabLevel



 

msie

 

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