Bueno Jorge, despues de comerme un rato la quijotera al final lo he conseguido. Pero no se realmente si esta optimizado, no se si podrias ayudarme en este aspecto.
Aparte, el comportamiento del área de selección esta programado dentro de una clase que actúa como recinto para el área, para que fuera de él no puedas seleccionar nada. No se si es la mejor manera, ya que quisiera que estuviera mas modulado, en una clase aparte, pero depende de los detectores de eventos de ratón del recinto para dibujar el área asi que no se si dejarlo así.
En vez de un rectangle he usado el API de dibujo para dibujar un rectangulo.
Clase Cuadro (actúa como recinto para el área). Esta instanciado en el escenario y su padre es el escenario o Stage. Los elementos a seleccionar tambien estan instanciados en el escenario y tambien su padre es el escenario.
Código ActionScript :
package
{
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.display.Stage;
import flash.events.*;
import flash.display.Shape;
import flash.display.Graphics;
public class Cuadro extends MovieClip
{
public var estado:Boolean=false;
public var rectangulo:Shape=new Shape();
//PROPIEDADES PARA EL RECTANGULO
public var inix_rect:Number=0;
public var iniy_rect:Number=0;
public var base_rect:Number=0;
public var alt_rect:Number=0;
//CONSTRUCTOR
public function Cuadro()
{
//INICIO RECTANGULO
rectangulo.graphics.lineStyle(1);
rectangulo.graphics.beginFill(0xAF0000,.1);
rectangulo.graphics.drawRect(0,0,0,0);
addChild(rectangulo);
//EVENTOS
addEventListener(MouseEvent.MOUSE_DOWN,emp);
addEventListener(MouseEvent.MOUSE_UP,emp);
addEventListener(MouseEvent.MOUSE_MOVE,emp);
}
public function emp(e:MouseEvent):void
{
if (e.type=="mouseDown")
{
hit();
limpio();
inix_rect=mouseX;
iniy_rect=mouseY;
estado=true;
}
else if (e.type=="mouseUp")
{
estado=false;
limpio();
removeEventListener(Event.ENTER_FRAME, dibujo);
}
else if (e.type=="mouseMove")
{
if (estado==true)
{
addEventListener(Event.ENTER_FRAME,dibujo);
base_rect=(inix_rect-mouseX)*(-1);
alt_rect=(iniy_rect-mouseY)*(-1);
}
else
removeEventListener(Event.ENTER_FRAME, dibujo);
}
}
public function dibujo(e:Event):void
{
limpio();
//Dibujamos el rectangulo
rectangulo.graphics.drawRect(inix_rect,iniy_rect,base_rect,alt_rect);
}
//Inicializamos el Shape y sus caracteristicas
public function limpio():void
{
rectangulo.graphics.clear();
rectangulo.graphics.lineStyle(1);
rectangulo.graphics.beginFill(0x009922,.3);
}
//Funcion para comprobar que elementos se tocan cuando soltamos el ratón
public function hit():void
{
for(var i:uint=1;i<parent.numChildren;i++)
{
if (rectangulo.hitTestObject(parent.getChildAt(i))==true)
{
trace(parent.getChildAt(i).name + " tocado");
//Aqui podemos llamar a un metodo del elemento tocado
//para aplicarle un filtro de iluminación o algo asi.
MovieClip(parent.getChildAt(i)).metodo_del_tocado();
}
}
}
}
}
Algún tipo de feedback estaría bien, hace pocas semanas que empezé con AS3 y de manera no continuada, asi que cualquier corrección y ayuda es bienvenida.
Saludos gente!