Flash: Problema con botón en efecto clase Bitmapdata
Hola, me intentaré explicar mejor...
Me bajé un script de un efecto de agua con clase BitmapData de Flash 8, está en esta URL
Queda un efecto muy interesante.
El caso es que no logro poner un botón dentro de la imagen.
La imagen queda siempre por encima.
No es una cuestión de capas, la imagen está vinculada desde la biblioteca y desde el documento no puede verse, y está dentro de un Movie Clip creado desde el panel de acciones, que tampoco está visible.
Estoy más verde que una lima en Actionscript.
Añado el código, aunque está mejor ordenado aquí http://www.cristalab.com/tips/33701/efecto-de-agua-con-la-clase-bitmapdata--de-flash-8#ultimo
<code>import flash.display.*;
import flash.geom.*;
import flash.filters.*;
img = BitmapData.loadBitmap("imagen");
w = img.width-1;
h = img.height-1;pt = new Point();
Nx = new Matrix();
Mx = new Matrix();
Mx.scale(2, 2);
fz = 60;// fz: fuerza del oleaje de 0 en adelante;
v = (255/256)-1/100000;
sal = new BitmapData(w/2, h/2);sal1 = sal2=new BitmapData(w, h);
ori = acum=new BitmapData(w/2, h/2, false, 128);
aguaMC = this.createEmptyMovieClip("e",10);
aguaMC.attachBitmap(sal2, 0);
ola = new ConvolutionFilter(3, 3, [1, 1, 1, 1, 1, 1, 1, 1, 1], 9);
ade = new ColorTransform(0, 0, v, 1, 0, 0, 2, 0);
agua = new DisplacementMapFilter(sal2, pt, 4, 4, fz, fz);
onda();
aguaMC.onRollOver = function () {
pul = true; clearInterval(ID); ID = setInterval(onda,30);
}
aguaMC.onRollOut = function () {
pul = false; clearInterval(ID);
}
function onda() {
if (pul) { cont = 0; ori.setPixel(_xmouse/2, _ymouse/2, 0) agua.scaleY = agua.scaleX += 10*(agua.scaleX<fz>fz) {
agua.scaleY = agua.scaleX -= 5*(agua.scaleX>50)+.25; }
}
sal.applyFilter(ori, new Rectangle(0, 0, w/2, h/2), pt, ola);
sal.draw(sal, Nx, null, "add");
sal.draw(acum, Nx, null, "difference");
sal.draw(sal, Nx, ade);
sal1.draw(sal, Mx, null, null, null, true);
sal2.applyFilter(img, new Rectangle(0, 0, w, h), pt, agua);
acum = ori; ori = sal.clone();
if (agua.scaleX<=0) {
agua.scaleY = agua.scaleX=fz;
cont = 0;
clearInterval(ID); }}</code>
Athomix
Crear un boton es muy sencillo, en google encontrarás miles, lo único que tienes que hacer es ponerle el nombre de instancia. Creo que es eso lo que no estás haciendo bien.
Sirve cualquier MovieClip o boton para que funcione.
inmaerre
Bueno... ya me lo imaginaba.
Gracias de todas formas por la ayuda prestada.
Athomix
chuwi
que bonito camion
:)
:D
chuwi
que bonito camion
:)
Athomix
buuuf! si es mucho pedir ....
inmaerre
Muchisimas gracias por el archivo.
Veo que el problema es el botón.
Yo había creado un botón normal en escenario. También habia probado a importarlo a biblioteca desde un jpg y en vinculaciones exportar para ActionScript, pero tampoco se veia.
No se si ya es mucho pedir... me podrias explicar los pasos para hacer el botón igual?
Athomix
Yo reenviar.
inmaerre
Perdón, la cuenta de correo buena es: info@inmariquelme.com
La otra ya no existe
Athomix
Yo enviar.
inmaerre
¿ Me podrias pasar el archivo fla para comparar?
No entiendo en que se diferencian...
inmaerre
mi poner dientes largos....
Athomix
http://www.athomix.com/TEST/domestika/agua/agua.swf
inmaerre
Yo quitar, pero a mi no me va.
No se que puede estar mal.
Sigue sin verse el botón
www.rayorama.net/prueba_agua.html
Athomix
Pues yo probar y funcionar ok.
Quita todo esto y vuelve a intentar
// Esto mi no entender. Por eso yo comentar.
//agua.scaleY = agua.scaleX += 10*(agua.scaleX<fz>fz) { agua.scaleY = //agua.scaleX -= 5*(agua.scaleX>50)+.25;
inmaerre
Y no hay manera de ponerlos juntos....
inmaerre
Hola, yo tampoco lo entiendo, pero mira, lo he colgado aquí www.rayorama.net/prueba_agua.html
de los dos ejemplos, en el de arriba he quitado esta parte
<em>// Esto mi no entender. Por eso yo comentar.
//agua.scaleY = agua.scaleX += 10*(agua.scaleX<fz>fz) { agua.scaleY = agua.scaleX -= 5*(agua.scaleX>50)+.25; </em>
y el resultado es que solo se ve el botón, que es una "A", pero desaparece de la vista el MC del agua.
en el de abajo, si que está esto
<em>agua.scaleY = agua.scaleX += 10*(agua.scaleX<fz>fz) { agua.scaleY = agua.scaleX -= 5*(agua.scaleX>50)+.25;
</em>
y el resultado es que el botón sigue sin verse.
Athomix
Voy a suponer que quieres hacer esto.
import flash.display.*;
import flash.geom.*;
import flash.filters.*;
img = BitmapData.loadBitmap("imagen");
w = img.width-1;h = img.height-1;
pt = new Point();Nx = new Matrix();
Mx = new Matrix();Mx.scale(2, 2);
fz = 60;// fz: fuerza del oleaje de 0 en adelante;
v = (255/256)-1/100000;sal = new BitmapData(w/2, h/2);
sal1 = sal2=new BitmapData(w, h);
ori = acum=new BitmapData(w/2, h/2, false, 128);
aguaMC = this.createEmptyMovieClip("e",10);
aguaMC.attachBitmap(sal2, 0);
ola = new ConvolutionFilter(3, 3, [1, 1, 1, 1, 1, 1, 1, 1, 1], 9);
ade = new ColorTransform(0, 0, v, 1, 0, 0, 2, 0);
agua = new DisplacementMapFilter(sal2, pt, 4, 4, fz, fz);
onda();
aguaMC.onRollOver = function () {
pul = true;
clearInterval(ID);
ID = setInterval(onda,30);
}
aguaMC.onRollOut = function () { pul = !pul; }
function onda() {
if (pul) {
cont = 0;
ori.setPixel(_xmouse/2, _ymouse/2, 0)
// Esto mi no entender. Por eso yo comentar.
//agua.scaleY = agua.scaleX += 10*(agua.scaleX<fz>fz) { agua.scaleY = agua.scaleX -= 5*(agua.scaleX>50)+.25;
}
sal.applyFilter(ori, new Rectangle(0, 0, w/2, h/2), pt, ola);
sal.draw(sal, Nx, null, "add");
sal.draw(acum, Nx, null, "difference"); sal.draw(sal, Nx, ade);
sal1.draw(sal, Mx, null, null, null, true);
sal2.applyFilter(img, new Rectangle(0, 0, w, h), pt, agua);
acum = ori; ori = sal.clone();
if (agua.scaleX<=0) { agua.scaleY = agua.scaleX=fz; cont = 0;
clearInterval(ID);
}
boton.swapDepths(this.getNextHighestDepth());
}
inmaerre
Lo he puesto aquí, pero sigue sin verse
function onda() {
if (pul) {
cont = 0;
ori.setPixel(_xmouse/2, _ymouse/2, 0)
agua.scaleY = agua.scaleX += 10*(agua.scaleX<fz>fz) { agua.scaleY = agua.scaleX -= 5*(agua.scaleX>50)+.25; } }
boton.swapDepths(this.getNextHighestDepth())
Gracias por la ayuda
Athomix
añade esto al final de la función onda
boton.swapDepths(this.getNextHighestDepth())
inmaerre
He puesto un botón en escenario llamado boton, y he añadido
al final del código boton.swapDepths(aguaMC)
Pero el botón sigue sin verse.
Adjunto otra vez el código completo:
import flash.display.*;
import flash.geom.*;
import flash.filters.*;
img = BitmapData.loadBitmap("imagen");
w = img.width-1;h = img.height-1;
pt = new Point();Nx = new Matrix();
Mx = new Matrix();Mx.scale(2, 2);
fz = 60;// fz: fuerza del oleaje de 0 en adelante;
v = (255/256)-1/100000;sal = new BitmapData(w/2, h/2);
sal1 = sal2=new BitmapData(w, h);
ori = acum=new BitmapData(w/2, h/2, false, 128);
aguaMC = this.createEmptyMovieClip("e",10);
aguaMC.attachBitmap(sal2, 0);
ola = new ConvolutionFilter(3, 3, [1, 1, 1, 1, 1, 1, 1, 1, 1], 9);
ade = new ColorTransform(0, 0, v, 1, 0, 0, 2, 0);
agua = new DisplacementMapFilter(sal2, pt, 4, 4, fz, fz);
onda();
aguaMC.onRollOver = function () {
pul = true;
clearInterval(ID);
ID = setInterval(onda,30);
}
aguaMC.onRollOut = function () { pul = false;
}
function onda() {
if (pul) {
cont = 0;
ori.setPixel(_xmouse/2, _ymouse/2, 0)
agua.scaleY = agua.scaleX += 10*(agua.scaleX<fz>fz) { agua.scaleY = agua.scaleX -= 5*(agua.scaleX>50)+.25; } } sal.applyFilter(ori, new Rectangle(0, 0, w/2, h/2), pt, ola);
sal.draw(sal, Nx, null, "add");
sal.draw(acum, Nx, null, "difference"); sal.draw(sal, Nx, ade);
sal1.draw(sal, Mx, null, null, null, true);
sal2.applyFilter(img, new Rectangle(0, 0, w, h), pt, agua);
acum = ori; ori = sal.clone();
if (agua.scaleX<=0) { agua.scaleY = agua.scaleX=fz; cont = 0;
clearInterval(ID); }}
boton.swapDepths(aguaMC);
Un saludo
Athomix
ruta.nombreInstanciaBoton.swapDepths(ruta.nombreInstanciaMovieClip)
porejemplo después de crear el agcuaMC, y suponiendo que el botón este en el escenario.
boton.swapDepths(aguaMC);
inmaerre
Os estaría muy agradecida si me pudierais dar algún ejemplo de como aplicar el swapDepths en este caso, para que por ejemplo un botón se vea por encima del MC.
damianmuti
El swapDepths lo q hace es cambiar el índice Z de los objetos; como bien lo dice su "nombre", cambiaProfundidad.
:)
inmaerre
Perdona mi ignorancia... qué es eso de swapDepths() ???
Athomix
Pues así a bote pronto, intenta usar swapDepths() con el botón... para que quede encima.