Primero que todo creemos un nuevo proyecto en As3.
Luego, para que entiendan un poco lo que hago explicare lo que haremos.
Una onda sonora, imaginémosla como una esfera (tridimensional) que se expande, crece. Que cuando esa esfera llega a nuestros oÃdos, escuchamos el sonido.
Una sonora al viajar por el espacio, va perdiendo su intensidad por lo que entre más lejos estemos, menos la escucharemos. La razón de intensidad es potencia partido por superficie de la esfera.
De manera que entre más superficie tenga la esfera (mayor sea su tamaño) menor sera la intensidad.
La potencia lo podemos pensar como con la fuerza que comienza. Ejemplo, su yo susurro mi potencia sera mucho más pequeña que si diera un fuerte grito.
Como ultimo, recordar que la superficie de una esfera es: 4Ï€r2 (4 Pi por radio al cuadrado)
Dejémonos de tanto blabla y vamos al grano.
Vamos a el primer frame y escribimos lo siguiente:
var potencia:Number=10000; //Potencia de la Onda
function newOnda(e:MouseEvent){
var onda:MovieClip=new MovieClip();
addChild(onda);
onda.x=mouseX;
onda.y=mouseY;
onda.radio=1;
onda.superf=1;
onda.pot=potencia;
onda.addEventListener(Event.ENTER_FRAME, expandir);
}
function expandir(e:Event){
var target=e.currentTarget;
target.superf=4*Math.PI*Math.pow(target.radio,2);
var inten=target.pot/target.superf;
target.graphics.clear();
target.graphics.lineStyle(2,0,inten);
target.graphics.drawCircle(0,0,target.radio);
target.radio++;
if(target.inten<0.01){
target.removeEventListener(Event.ENTER_FRAME,expandir);
removeChild(target);
}
}
stage.addEventListener(MouseEvent.MOUSE_DOWN, newOnda);
Explico el código.
Primero esta la variable Potencia que no es nada más que la potencia. Intenten que no sea menor que 100.
Luego esta la función newOnda lo que hace es crear la nueva onda con sus propiedades. (Posición del Mouse por ejemplo, para que aparezca donde hacemos click) luego al final de la función, a este MovieClip que sera una de nuestras Onda Sonoras se le agrega un Listener con la función expandir que se encarga de dibujar la onda según las propiedades. Una vez que la onda tiene una Intensidad menor a 0.01 sera eliminada, para no gastar demasiados recursos.
Por ultimo la función de abajo es la que se encarga de que cada vez que se haga click se ejecute la función newOnda
!Wala, tenemos una onda Sonora con perdida de intensidad ( 2D eso sÃ) y un bonito efecto.
(Click aquà abajo, para probar)
Enjoy It.
Muy bonito el efecto, me resulto de lujo =D muchas gracias.
Pero me gustaria saber como hacer para que las ondas sean de otro color.
Nose si se puede, ojala puedas responderme, te estaria muy agradecido =)
Saludos ^^
Lalu, es bastante fácil. En la linea de código que dice:
target.graphics.lineStyle(2,0,inten);El numero 0 está indicando el color negro. Lo correcto es colocar colores de la siguiente forma:
0xRRGGBB si sabes como trabajar colores con esta forma te sera muy fácil. (Busca en google RGB)
Por ejemplo negro es: 0×000000
Azul: 0x0000FF
Verde: 0x00FF00
Rojo:0xFF0000
y Blanco:0xFFFFFF
Por ejemplo para que fuese de color rojo usas:
target.graphics.lineStyle(2,0xFF0000 ,inten);Espero que no tengas problemas, cualquier duda vuelve a preguntar.
PD: Seria también buena idea colocar el color dentro de una variable y asà que el color pueda ser aleatorio.
Gracias por responder, en todo caso me puse a buscar hace unas horas y encontre como se hacia, y tambien se me ocurrio eso de usar Math.random() y me resulto perfectamente.
Aunque tuve problemas para intentar cambiar de figura, pude hacer que la onda fuera cuadrada, pero el problema es que cuando crece no lo hace desde el centro del click, sino que solo los lados de abajo y la derecha crecen y se alejan, mientras que los de la izquierda y arriba solo se prolongan las lineas, pero no se alejan del mouse :/, ademas que crecen infinitamente xd, osea no se difuminan como los circulos =/.
Si me pudieras ayudar =).
PD: ¿Sera muy dificil hacer ondas con figuras que no esten definidas en las funciones? (drawCircle, drawRect y drawEllipse) por ejemplo, una estrella?
Saludos y gracias denuevo por responder tan rapido =D
Si, a ser sincero hacerlo con una figura cualquiera seria bastante más difÃcil, pero para nada imposible.
Sobre el problema con el cuadrado, es que tienes que modificar el codigo de manera que el centro del cuadrado siempre quede donde hiciste click. Para ello ocupas como “Lugar del click menos Tamaño del cuadrado”. “mouseX-RadioX” “mouseY-RadioY” algo asÃ.
Mucha suerte
Oie podrias ayudarme para hacer unas ondas..
tal cual estan en el ejemplo pero sin dar click osease en automatico.las necesito para señalar capitales de mi pais
seria posible?
Leo, es bastante simple…
cambia:
function newOnda(e:MouseEvent){por:
function newOnda(e:Event){y:
stage.addEventListener(MouseEvent.MOUSE_DOWN, newOnda);por:
stage.addEventListener(Event.ENTER_FRAME, newOnda);Javier! Agradezco tu pronta respuesta, Perdona mi atrevimiento pero podrias enviarme el archivo abierto (.fla) para poder manipularlo.
Te explico…
me encuentro en este momento trabajando con un equipo que tiene solaris y y simultáneamente con otros sistemas requiero en calidad de urgencia resolver esta limitante.(para un desarrollo web)
Te pido tu apoyo y valioso tiempo.