Comunidad de diseño web y desarrollo en internet online

Problema con sonido de fondo de un juego.

Citar            
MensajeEscrito el 02 Nov 2012 11:52 am
Hola, soy nuevo en el foro, tengo 32 años, soy un chico de Canarias, y estoy haciendo un juego de plataformas desde hace unos seis meses...suelo buscar las respuestas a todas mis dudas buceando por internet, en foros y demás, pero llevo 3 días intentando solucionar un problema y nada, no lo consigo.
Bueno, al tema...la música principal del juego la tengo en el primer frame, dentro de la vcam. La tengo escrita de manera que se reproduzca sola; y se pause o se reproduzca cuando pulse el correspondiente botón...cuando el personaje muere traslado la acción a una pantalla de game over (escena 2) donde tengo puesto un stopAllSounds(); para que pare la música de fondo, y cuando le doy al botón de reiniciar la partida, todo bien, excepto que no suena música por ningún lado, ni automáticamente ni apretando el botón de música...y no entiendo el porqué...
Aquí está el script para el botón de música:

Código :

var pausa:Number = 0;
var estado:Number = 0;
/* Como no le pusimos ninguna acción al Movie Clip, para que no se reprodujera
como loco, lo frenamos al comienzo*/
Boton_btn.stop();
/*Atachamos inmediatamente el sonido linkeado desde la biblioteca a una variable
llamada: "misonido"*/
_root.onLoad = function(){
    misonido = new Sound();
    misonido.attachSound("sonido");
   misonido.start();
}
//En el evento onPress ó cuando presione el botón
Boton_btn.onPress = function (){
    if (estado == 0){
        /* se verifica en que estado se encuentra el sonido, si está en 0, ósea el sonido no se esta reproduciendo,
        ponemos play al sonido; usamos la variable de pausa que contiene
        lo que lleva la canción reproducida hasta el momento en milisegundos, por eso lo dividimos entre 1000;
        para que nos de exactamente la posición donde se encuentra*/
        misonido.start(pausa/1000);
        //Una vez el sonido en play, cambiamos el estado a 1, ósea reproduciéndose
        estado = 1;
        //y finalmente cambiamos la apariencia del botón
        Boton_btn.gotoAndStop("pausa");
    } else {
        /*En caso de que no sea 0, significa que se esta reproduciendo la canción y 
        queremos detenerla, primero calculamos la posición donde se va a quedar en pause
        almacenándolo en la variable pausa*/
        pausa = misonido.position;
        //detenemos totalmente el sonido
        misonido.stop();
        //cambiamos el estado a 0, ósea sin sonido
        estado = 0;
        //y finalmente cambiamos la apariencia del botón
        Boton_btn.gotoAndStop("reproducir");
    }
} 


también he probado cambiando stopAllSounds por _root.vcam.sonido.stop(); pero obtengo exactamente el mismo resultado, espero vuestra ayuda, e intentaré ayudar en lo posible en lo que pueda a la comunidad
P.D.: ¿le tendré que poner algún unload al sonido?... :)

Por chachon2

41 de clabLevel



 

chrome
Citar            
MensajeEscrito el 02 Nov 2012 01:01 pm
Este callback se ejecuta una sola vez

_root.onLoad = function(){

Considera poner algo que vuelva a instanciar tu musica ... posiblemente nada, solo instancias el sonido y ya

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 02 Nov 2012 02:12 pm
Gracias por tu pronta respuesta, solisarg, no te miento si te digo que he revisado esta web un par de veces esta mañana, después de enviar mi mensaje...
Estaría agradecido si me mostraras un ejemplo. Gracias a tu respuesta volví a instanciar el sonido en la pantalla de game over con

Código :

misonido = new Sound();
    misonido.attachSound("sonido");
y le añadí al botón de reiniciar partida

Código :

on (press){
   misonido.start();
   _root.gotoAndStop("fase_1");
}

Ahora, claro, se vuelve a reproducir la música desde el principio, que era uno de los problemas. Ahora el problema está en que una vez reiniciada la partida el botón de música no hace nada.

Por chachon2

41 de clabLevel



 

chrome
Citar            
MensajeEscrito el 02 Nov 2012 02:18 pm
Esto es un problema de diseño bastante típico de "linea de tiempo", donde componentes generales se atan a un frame.
Bien, dicho esto habría un par de soluciones. La correcta es crear un SoundManager que manejara el sonido independientemente de la línea de tiempo, una clase que se instanciara y luego manejara sus propios recursos ... pero sospecho que tu estructura es mas de acumulación de MovieClips y código en timeline. Si ese es el caso, entonces lo mejor es que en el primer fotograma hagas un misonido.start(); fuera del _root.onLoad para que se ejecute (deberías usar un Booleano como te indique antes para saber si la aplicación ya fue inicializada o no) Creo que el sonido sigue existiendo, pero hace mucho que no programo en línea de tiempo.

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 02 Nov 2012 04:56 pm
:oops: lo siento, chico, parece que no soy capaz de hacerlo... :ownz: si tienes tiempo me pondrías un ejemplo? muchísimas gracias

Por chachon2

41 de clabLevel



 

chrome
Citar            
MensajeEscrito el 02 Nov 2012 06:16 pm
Es verdad, mucho rollo, saca misonido.start(); fuera del _root.onLoad, así cuando vuelves al frame igual se ejecuta

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 02 Nov 2012 10:45 pm
Probé lo que dijiste, pero no funcionaba, ya que empeoraba el asunto.
Tuve una idea, y me dije...¿y si lo mando casi todo al primer frame del juego? Lo que hice fue meter la instancia del sonido en el primer frame de la línea principal del timeline, junto con la función del botón de música, y además le cambié el valor a var estado:Number = 0; por 1, para que no se repitiese el sonido la primera vez que pulsaba el botón, dejando la llamada de _root.onLoad en el primer frame de la vcam, en donde estaba originalmente.
La parte dedicada al sonido del primer frame del timeline quedó así:

Código :

var pausa:Number = 0;
var estado:Number = 1;
misonido = new Sound();
    misonido.attachSound("sonido");
   misonido.start();
   //En el evento onPress ó cuando presione el botón
   _root.vcam.Boton_btn.onPress = function (){
    if (estado == 0){
        /* se verifica en que estado se encuentra el sonido, si está en 0, ósea el sonido no se esta reproduciendo,
        ponemos play al sonido; usamos la variable de pausa que contiene
        lo que lleva la canción reproducida hasta el momento en milisegundos, por eso lo dividimos entre 1000;
        para que nos de exactamente la posición donde se encuentra*/
        misonido.start(pausa/1000);
        //Una vez el sonido en play, cambiamos el estado a 1, ósea reproduciéndose
        estado = 1;
        //y finalmente cambiamos la apariencia del botón
        _root.vcam.Boton_btn.gotoAndStop("pausa");
    } else {
        /*En caso de que no sea 0, significa que se esta reproduciendo la canción y 
        queremos detenerla, primero calculamos la posición donde se va a quedar en pause
        almacenándolo en la variable pausa*/
        pausa = misonido.position;
        //detenemos totalmente el sonido
        misonido.stop();
        //cambiamos el estado a 0, ósea sin sonido
        estado = 0;
        //y finalmente cambiamos la apariencia del botón
        _root.vcam.Boton_btn.gotoAndStop("reproducir");
    }
}


Muchisisisisisisisisisisisímas gracias, Jorge, esta noche podré dormir. Aquí tienes un amigo.

Por chachon2

41 de clabLevel



 

chrome

 

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