Comunidad de diseño web y desarrollo en internet online

Superposición y mouseEnabled

Citar            
MensajeEscrito el 08 Jul 2010 12:02 am
Buenas!
Llevo unos dias dándole vueltas al tema y lo que leo no parece corresponderse con los resultados que obtengo, a ver quién me ilumina.

Pongamos que tengo un cuadrado, y encima de él, dentro de su superficie, pongo un círculo bastante más pequeño.
Al cuadrado le asocio un evento ROLL_OVER. Lo que quiero es que cuando se pasa el puntero por el área del cuadrado, aparezca un tercer movieclip, digamosle triángulo (que en un futuro tendrá botones dentro de él, pero eso es otro tema) que tapará a ambos hasta que el puntero se salga de nuevo del área del cuadrado.

cuadrado.addEventListener(MouseEvent.ROLL_OVER, onOver);
cuadrado.addEventListener(MouseEvent.ROLL_OUT, onOut );

Así que en la función que dispara el ROLL_OVER simplemente hacía el triángulo visible, ya que según leo, la instancia que queda por encima de todas en un caso de superposición -es decir, la más visible- es la que recibe los eventos, y yo los he añadido por el orden: 1ºcuadrado, 2º círculo y 3º triángulo. Pero obtenía un parpadeo constante del triángulo cuando el cursor entraba en el área del cuadrado y probé cosas como ésta:

private function onOver(e:Event) : void {
triangulo.visible = true;
cuadrado.mouseEnabled = false;
circulo.mouseEnabled = false;
}

private function onOut(e:Event) : void {
triangulo.visible = false;
cuadrado.mouseEnabled = true;
circulo.mouseEnabled = true;
}

"When an InteractiveObject instance’s mouseEnabled variable is set to false, it receives no mouse-input event notifications.". Pero nada, sigue el parpadeo. He estado probando otras cosas que he visto por ahí, pero no acababan de funcionar del todo bien, porque si bien ya no estaba el parpadeo, cuando se pasaba por la zona en la que se intuía el círculo, el parpadeo vuelve momentáneamente.

Los ejemplos que he encontrado no acababan de ajustarse a mi caso, ya que no contemplan el caso del círculo.
¿Qué hago mal?

Por Eldelgas

8 de clabLevel



 

firefox
Citar            
MensajeEscrito el 10 Jul 2010 04:23 am
He probado a adaptar a mi caso la solución que da LongeVie en
http://foros.cristalab.com/botones-dentro-de-una-animacion-t68158/

private function onOver(e:Event) : void {
var visibilidad:Boolean = mouseX < cuadrado.width && mouseY < cuadrado.height && mouseX > 0 && mouseY > 0;
triangulo.visible = !visibilidad;
circulo.visible = visibilidad;
cuadrado].visible = visibilidad;
}

private function onOut(e:Event, indice:Number) : void {
var visibilidad:Boolean = mouseX < cuadrado.width && mouseY < cuadrado.height && mouseX > 0 && mouseY > 0;
triangulo.visible = visibilidad;
cuadrado.visible = !visibilidad;
venfermos[indice].visible = !visibilidad;
}


¡Pero permanece el dichoso parpadeo! o_O

Por Eldelgas

8 de clabLevel



 

firefox
Citar            
MensajeEscrito el 10 Jul 2010 05:27 am
algo tendrá que ver , no revise bien tu codigo pero el parámetro que recibe un handler debe coincidir con el tipo de evento que activo el listener, en tu caso le pones Event cuando debe ser MouseEvent.

Código ActionScript :

private function onOver(e:MouseEvent):void //e:MouseEvent
{
   //...
}


Jonathan

Por maneuver

243 de clabLevel



Genero:Masculino  

Mexico City

chrome
Citar            
MensajeEscrito el 10 Jul 2010 07:40 pm
No se si estaria muy equivocado o no, pero Jonathan tiene razon aunque esto no deberia ocurrir, ya que si no estoy muy equivocado la Clase MouseEvent desciende y/o hereda de event, por lo que tan solo se hace un "polimorfismo" . Realmente la instancia declarada como Event para recibir el MouseEvent no es incorrecto y no deberia dar problema, aunque si no hay ninguna razon para hacer esta conversion, se deberia utilizar MouseEvent en vez de Event.

Un saludo!

Por astroluzz

3 de clabLevel



 

safari
Citar            
MensajeEscrito el 11 Jul 2010 06:45 am
Bueno, antes de nada gracias a ambos por responder.
Probé a cambiar lo del tipo de evento que decía maneuver. Es verdad, parece que no iban por ahí los tiros, porque la cosa seguía igual. Al final lo he resuelto de otro modo, con hitTest. No sé si será la forma más óptima o si las hay más sencillas pero por lo menos no me hace cosas raras. Allá va el código y los archivos por si alguien le interesa:
...
cuadrado = new Cuadrado();
cuadrado.x = 222;
cuadrado.y = 95;
addChild( cuadrado );

circulo = new Circulo();
circulo.x = 222;
circulo.y = 95;
addChild( circulo );

triangulo = new Triangulo();
triangulo.x = 222;
triangulo.y = 95;
addChild( triangulo );

addEventListener(Event.ENTER_FRAME,onEnterFrame);
}

function onEnterFrame(event:Event){
var testOverTriangulo:Boolean = (cuadrado.hitTestPoint(mouseX, mouseY, true));
if (testOverTriangulo && !overTriangulo) {
trace("dentro del cuadrado");
triangulo.visible = true;
overTriangulo = true;
} else if (!testOverTriangulo && overTriangulo) {
trace("fuera del cuadrado");
overTriangulo = false;
triangulo.visible = false;
}
};


Los archivos:
[url=http://www.megaupload.com/?d=J5NWE62J][/url]

Por Eldelgas

8 de clabLevel



 

firefox

 

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