Comunidad de diseño web y desarrollo en internet online

Arrastry y posición relativa de dos movieclips

Citar            
MensajeEscrito el 21 Abr 2008 11:16 am
Hola gente.
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.

Por CidDeMizar

81 de clabLevel



 

msie7
Citar            
MensajeEscrito el 21 Abr 2008 06:51 pm
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


Un par de MC con alpha 0 para demarcar la zona destino, usa startDrag y el viejo pero aún usable dropTarget
Si usas algo tipo MouseHide para mover el elemento, usa hitTest al soltarlo con los mismos dos MC

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 22 Abr 2008 06:09 am
Como siempre, un pozo de sabiduría, Jorge. Muchísimas gracias.

Por CidDeMizar

81 de clabLevel



 

msie7

 

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