Ya estoy otra vez preguntando cosas que para vosotros me imagino que serán tonterías, pero que para mí son un mundo.
Necesito que un movieclip "arrastrable" se coloque dentro de un área determinada de la pantalla y detecte si está dentro de ese área o no. Para hacer el tinglado, he generado un código de arrastre basado en otro que encontré por la red (no recuerdo dónde, lo siento) que hacía el drag del movieclip mucho mejor que el startDrag del flash.
Después, viendo que el flash no tiene (o no conseguí encontrar) algo parecido al "sprite(a).within(b)" que tenemos en Director, me curré un prototype que hiciera la detección de si el Mc(a) está totalmente posicionado dentro del área que ocupa el Mc(b) en la pantalla.
En principio todo funciona. el problema me ha llegado cuando he querido hacer las llamadas a las distintas rutinas desde un evento "on (press)" / "on(release)" dentro del movieclip, en vez de asignarle funciones específicas al Mc arrastrable.
Os lo explico colgando aquí el código que he escrito.
MODELO QUE FUNCIONA:
En pantalla tengo un Mc llamado "destino_mc" que es el que marca el área de pantalla a controlar; luego, tengo otro Mc llamado "arrastra_mc" que es el que se mueve con el ratón. La película sólo tiene 1 frame y el código correspondiente es:
MovieClip.prototype.startSuave = function (centrado:Boolean) {
if (centrado == undefined) {
var restringeArea:Boolean = false;
}
// calculo su centro geométrico
var limites_obj:Object = this.getRect (this);
var centroTeoricoX = (limites_obj.xMax - limites_obj.xMin) / 2;
var centroTeoricoY = (limites_obj.yMax - limites_obj.yMin) / 2;
var centroX = limites_obj.xMin + centroTeoricoX;
var centroY = limites_obj.yMin + centroTeoricoY;
//
var thisXMouse:Number = this._xmouse;
var thisYMouse:Number = this._ymouse;
var Posiciona:Function = function (destino:Object) {
destino._x = destino._parent._xmouse - ((centrado) ? 0 + centroX : thisXMouse);
destino._y = destino._parent._ymouse - ((centrado) ? 0 + centroY : thisYMouse);
};
Posiciona (this);
this.onMouseMove = function () {
Posiciona (this);
updateAfterEvent ();
};
};
MovieClip.prototype.pararSuave = function () {
this.onMouseMove = null;
};
arrastra_mc.onPress = function () {
this.startSuave (true);
};
arrastra_mc.onRelease = arrastra_mc.onReleaseOutside = function () {
this.pararSuave ();
var dentro = this.Within (destino_mc);
trace (dentro);
};
MovieClip.prototype.Within = function (destino:MovieClip):Boolean {
// calculo las 4 esquinas del arrastrable
var limites_obj:Object = this.getBounds (this);
// como la _x e _y del mc me las devuelve en global, calculo las esquinas
// sumándole los parámetros del getBounds, ya que si son inferiores al
// punto de control, estos valores serán negativos y se restarán a las
// coordenadas x e y del mc; si son superiores, se sumarán, como debe ser
var this_xMin = this._x + limites_obj.xMin;
var this_yMin = this._y + limites_obj.yMin;
var this_xMax = this._x + limites_obj.xMax;
var this_yMax = this._y + limites_obj.yMax;
// calculo las 4 esquinas del destino
var destino_obj:Object = destino.getBounds (destino);
var destino_xMin = destino._x + destino_obj.xMin;
var destino_yMin = destino._y + destino_obj.yMin;
var destino_xMax = destino._x + destino_obj.xMax;
var destino_yMax = destino._y + destino_obj.yMax;
//Compruebo si el móvil está dentro del destino
if ((this_xMin >= destino_xMin) && (this_yMin >= destino_yMin) && (this_xMax <= destino_xMax) && (this_yMax <= destino_yMax)) {
return true;
} else {
return false;
}
};
El primer prototype es el de movimiento, en el que también calculo el centro geométrico del mc arrastrable para el caso de que se desee centrar con respecto al mouse.
Ell segundo prototype es el de "stopdrag".
Después vienen las funciones que actúan de llamada a los prototypes al actuar con el ratón sobre el mc arrastrable.
Por último, está el prototype "Within" que es el que hace la comprobación de coordenadas entre el mc arrastrable y el destino. Si observáis este prototype, veréis que me devuelve un true o false que se recoge en la variable "dentro" que está en el evento on release del mc "arrastra_mc";
el trace de "dentro" me devuelve correctamente "true" o "false" dependiendo de si "arrastra_mc" está dentro de "destino_mc".
El problema viene ahora. He intentado sustituir las funciones "arrastra_mc.onPress" y "arrastra_mc.onRelease = arrastra_mc.onReleaseOutside" por eventos asociados al movieclip, esto es, seleccionando el movieclip "arrastra_mc" y entrando en la ventana de acciones he escrito el siguiente código:
on (press) {
this.startSuave (true);
};
on(release, releaseOutside) {
this.pararSuave ();
var dentro = this.Within (destino_mc);
trace (dentro);
};
Y sigue funcionando bien, excepto por la variable "dentro": siempre me devuelve TRUE, aunque arrastra_mc no esté dentro del objetivo.
¿Me podríais decir qué diantre tengo que hacer para que en este segundo supuesto la variable "dentro" me devuelva realmente si "arrastra_mc" está dentro de "destino_mc" o no? Es que ya no sé qué probar.
Gracias de antemano.
