Ver Mensaje Individual
  #2 (permalink)  
Antiguo 26/03/2009, 12:03
pepinliria
 
Fecha de Ingreso: marzo-2009
Mensajes: 13
Antigüedad: 15 años, 10 meses
Puntos: 1
Respuesta: Detectar click "a traves" de una sombra

Bien, ya está solucionado, paso a explicar el tema para si alguien alguna vez lo necesita, ya que para mí es algo muy útil.

El tema es que con AS3, eventos como clics de ratón ocurren sobre un determinado objeto individualmente, vamos que cuando haces clic sobre un botón por ejemplo, solo ese objeto recibe el evento, a pesar de que físicamente el ratón este sobre otro objeto también.

En AS1 y AS2 cuando los botones o clips de película reciben un evento, coge preferencia el objeto que está por encima. Si tienes 2 botones en la misma posición con la misma forma y haces clic, el de arriba del todo es el único que recibe el evento, como ahora en AS3.

Aun así, en AS1 y AS2, los clips de película que no tenían asociado un evento de ratón (onPress, onRelease...) no capturan los eventos y permiten que los objetos que hay detrás los capturen. Esto en AS3 no pasa. Lo que sí se puede, es decidir si un objeto, tenga o no event listeners, capture los eventos.

Esto se hace con la propiedad mouseEnabled (flash.display.InteractiveObject.mouseEnabled).

Cuando la propiedad mouseEnabled de un display object (del tipo InteractiveObject, no todos los display objects) es true (por defecto) ese objeto, y solo ese objeto, capturara los eventos de ratón, previniendo a los objetos que hay por detrás que reciban el evento. Cuando es false, el objeto no recibirá el evento y el evento atravesara el objeto, pudiéndose capturar desde el objeto que hay detrás.

Como he comentado, mouseEnabled es verdadero por defecto. Vamos, que todos los eventos serán capturados exclusivamente por los objetos que hay encima.


Aquí os dejo un ejemplo para que lo probéis. Solo tenéis que crear un archivo nuevo de flash AS3 y pegar el código en el primer fotograma y a probar. Veréis que tal como está el código (con la línea que esta comentada) el objeto de abajo no recibe eventos a través del de arriba, si la descomentais veréis que haciendo clic en el objeto de abajo a través del de arriba sí que los recibe.

En mi caso solo he tenido que ponerle la propiedad a la sombra, que era la que me molestaba.

Saludos y espero no haber sido demasiado extenso.


Código:
var cuadradoSuperior:Sprite = new Sprite();
cuadradoSuperior.name = "cuadradoSuperior";
cuadradoSuperior.graphics.beginFill(0x00FF00, .6);
cuadradoSuperior.graphics.drawRect(25, 20, 100,50);
cuadradoSuperior.graphics.endFill();

var cuadradoInferior:Sprite = new Sprite();
cuadradoInferior.name = "cuadradoInferior";
cuadradoInferior.graphics.beginFill(0xAA0000, 1);
cuadradoInferior.graphics.drawRect(0, 00, 100,50);
cuadradoInferior.graphics.endFill();

addChild(cuadradoInferior);
addChild(cuadradoSuperior);

cuadradoInferior.addEventListener(MouseEvent.CLICK, eventoClick);

//cuadradoSuperior.mouseEnabled = false;

function eventoClick(event:MouseEvent):void {
    var cuadrado:Sprite = event.target as Sprite;
    if (cuadrado) {
        trace(cuadrado.name);
    }
}

Última edición por pepinliria; 26/03/2009 a las 13:22