| |||
Respuesta: limite de movimiento startdrag ¿es un area rectangular?, de todos modos averigua sobre el metodo MovieClip.hitTest(), el cual detecta si se superponen 2 MovieClips en alguna parte. entonces mientras se este arrastrando compruebas si el mcArrastrado NO esta sobre esa area entoces detienes el arrastre con MovieClip.stopDrag() y ubicas el mcArrastrado en la coordenada limite de tu area (ojo que el area es otro mc que debe definir tu area). Mis saludos. |
| ||||
Respuesta: limite de movimiento startdrag a ver, lo intentare, lo del area rectangular es asi: on(press){ startDrag("destino" coordenada, coordenada, coordenada, coordenada) } pero no me funciona un saludo |
| |||
Respuesta: limite de movimiento startdrag Hola Chabri, hice un ejemplo a la rápida, la lógica es diferente a la que te propuse anteriormente, ahora puse 4 mc's que determinan el limite rectangular (arriba,abajo,derecha,izquierda), cada mc es una linea ubicada es una de estas posiciones, la idea es que cuando el mc que quieres arrastrar (en este caso circulo_mc) toque uno de los mc limite se detenga su arrastre con stopDrag(); de buenas a primeras no funciona al 100%, pero te puede servir de guía: Dejo el link de donde subí la "Ayuda.fla" y pongo el código por si a alguien le sirve o pueden mejorarlo. http://rapidshare.com/files/392379087/Ayuda.fla.html http://www.megaupload.com/?d=C93OG245 Mis saludos. //variable que te sirve para que desde el evento onMuseMove //compruebes si se esta arrastrando el circulo this.circulo_mc.arrastrando = new Boolean(false); this.circulo_mc.onPress = function() { this.startDrag(); this.arrastrando = true; }; this.circulo_mc.onMouseMove = function() { if(this.arrastrando) { restringirArrastre(this);//this hace referencia a circulo_mc } }; this.circulo_mc.onRelease = function() { this.arrastrando = false; restringirArrastre(this); this.stopDrag(); }; this.circulo_mc.onReleaseOutside = function() { this.arrastrando = false; restringirArrastre(this); this.stopDrag(); }; function restringirArrastre(mc:MovieClip):Void { if(mc.hitTest(limiteIzquierda_mc)) { mc.stopDrag(); mc._x += 2; } if(mc.hitTest(limiteDerecha_mc)) { mc.stopDrag(); mc._x -= 2; } if(mc.hitTest(limiteAbajo_mc)) { mc.stopDrag(); mc._y -= 2; } if(mc.hitTest(limiteArriba_mc)) { mc.stopDrag(); mc._y += 2; } } |
| ||||
Respuesta: limite de movimiento startdrag eiiiiii perefcto, he utilizado un rectangulo de limite, lo cree a partir de lineas y mi mc no sale de ahi, muchas gracias! cualquier cosa si alguien lo decea subo los codigos! un saludo y mil graciasQ! |
| ||||
Respuesta: limite de movimiento startdrag hola! estoy intentando hacer algo parecido al problema aqui expuesto. Estoy haciendo un juego en el que hay un tablero con casillas y fichas.Quiero restringir el movimiento de la ficha para que no pueda salir del tablero. Tengo la clase Ficha.as
Código:
package { import flash.events.MouseEvent; import flash.display.*; public dynamic class Ficha extends Sprite { private var nombre:String; private var color:uint; private var casilla:Casilla; private var bloqueada:Boolean;//Será true cnd no sea el turno de esa ficha public function Ficha(p_nom:String,p_color:uint,p_bloq:Boolean, p_casilla:Casilla):void { super(); nombre=p_nom; color=p_color; bloqueada=p_bloq; casilla=p_casilla; if (! bloqueada) { addEventListener(MouseEvent.MOUSE_DOWN,arrastrar); addEventListener(MouseEvent.MOUSE_UP,soltar); } } public function getNombre():String { return nombre; } public function getColor():uint { return color; } public function setNombre(nom:String) { nombre=nom; } public function setColor(col:uint) { color=col; } public function getCasilla():Casilla { return casilla; } public function arrastrar(event:MouseEvent):void { this.startDrag(); } public function soltar(event:MouseEvent):void { this.stopDrag(); } public function dibujarFicha(x:int,y:int):void { var s:Sprite = new Sprite (); s.graphics.beginFill(color); s.graphics.lineStyle(2,0x800080); s.graphics.drawCircle(x,y,8); this.addChild(s); } public function moverArriba(num:int, f:Ficha):void { f.y=f.y- (20*num); } public function moverAbajo(num:int,f:Ficha):void { f.y=f.y+ (20*num); } public function moverIzquierda(num:int, f:Ficha):void { f.x=f.x- (20*num); } public function moverDerecha(num:int, f:Ficha):void { f.x=f.x+ (20*num); } public function getLocalX():Number { return x; } public function getLocalY():Number { return y; } Me gustaría crear alguna funcion en la clase que restringiera ese movimiento para luego poder implementarla en el .fla. El tablero es un cuadro Sprite con el que supongo que tengo que comparar la ficha mediante hitTestObject pero no se como hacerlo. Todo esto lo estoy haciendo con as3. Muchisimas gracias de antemano |
| ||||
Respuesta: limite de movimiento startdrag A ver... probaste así? Cita: (Donde cada coordenada es un número).on(press){ this.startDrag(true, coordenada, coordenada, coordenada, coordenada); } Creo que faltaban el this. y el true. Saludos!! |
| |||
Respuesta: limite de movimiento startdrag No conozco as3 pero leyendo livedocs aparece el metodo hitTestObject() en los Sprite's para hacer la comprobación de colision entre objs, que es análogo a hitTest() de los MovieClip's, entonces habría que ajustar el ejemplo que puse (en as2) para as3. http://livedocs.adobe.com/flash/9.0_...itTestObject() Mis saludos. |
| ||||
Respuesta: limite de movimiento startdrag Muchas gracias a los dos Jime25, lo que tu me dices no me deja ponerlo, solo acepta 2 parametros, por lo que deberia convertir el marco del tablero en un Rectangle y se me complicaria todo bastante... Respecto a lo que tu me pones mariox55, lo he puesto en practica pero no obtengo el resultado que esperaba. Lo que he hecho es lo siguiente: He creado esta funcion en la clase ficha
Código:
public function restringirMovTab(f:Ficha,s:Sprite):void { if(f.hitTestObject(s)){ removeEventListener(MouseEvent.MOUSE_DOWN,arrastrar); } En el .fla es donde creo y "dibujo" el marco del tablero, que es el objeto Sprite con el que comparo la anterior función.Lo que ocurre es que sin que la ficha esté tocando el marco, ésta no se puede mover, es decir, se "borra" del evento. Seguramente sea una tonteria de coordenadas o algo por el estilo pero si alguien me pudiera ayudar, le estaría eternamente agradecida, ya que no consigo dar con el error. Muchas gracias |
| ||||
Respuesta: limite de movimiento startdrag Al escribirlo aqui me he dado cuenta del error. Lo que ocurre es que yo no creo un marco, si no un cuadrado, y al estar las fichas en él, siempre estarán en colision por lo que de la manera que yo me lo estaba planteando jamas podrian moverse. Hay alguna manera de crear un marco, es decir, un cuadro vacio por dentro? Gracias |
| ||||
Respuesta: limite de movimiento startdrag sigo haciendoos participes de mis progresos, He mirado un poco mas arriba en la solucion que le dió mariox55 a chabri y he hecho lo siguiente:
Código:
siendo cada sprite uno de las lineas k "dibuja" el marco del tablero.El problema viene en que esta comprobacion solo la hace en el momento en el que se llama a la función, por lo que, como haría para cada vez k tocara una de esas lineas la ficha volviera a su sitio inicial o k no pudiera traspasar esa linea?public function restringirMovTab(f:Ficha,s1:Sprite,s2:Sprite,s3:Sprite,s4:Sprite):void { if(f.hitTestObject(s1)){ removeEventListener(MouseEvent.MOUSE_DOWN,arrastrar); } if(f.hitTestObject(s2)){ removeEventListener(MouseEvent.MOUSE_DOWN,arrastrar); } if(f.hitTestObject(s3)){ removeEventListener(MouseEvent.MOUSE_DOWN,arrastrar); } if(f.hitTestObject(s4)){ removeEventListener(MouseEvent.MOUSE_DOWN,arrastrar); } } gracias |
| |||
Respuesta: limite de movimiento startdrag Ese metodo ( restringirMovTab() ) debieses llamarlo dentro de un evento de Ficha (ya que de la clase Ficha instanciaras varios objetos que representan Ficha's). Ese evento debe funcionar de manera análoga al evento onMouseMove de MovieClip (de as2), es decir, el evento tiene que detectar que el mouse se esta moviendo para que por cada vez que se mueva se llame al metodo para hacer la comprobación de colisión y así poder aplicar la restricción a la ficha (restringir su posición). al parecer este es el evento: http://livedocs.adobe.com/flash/9.0_...vent:mouseMove Espero haber sido claro ;D Mis saludos. |
| ||||
Respuesta: limite de movimiento startdrag Cita: Muchas gracias mario, pero no se si te he entendido muy bien. He hecho lo siguiente:
Iniciado por mariox55 Ese metodo ( restringirMovTab() ) debieses llamarlo dentro de un evento de Ficha (ya que de la clase Ficha instanciaras varios objetos que representan Ficha's). Ese evento debe funcionar de manera análoga al evento onMouseMove de MovieClip (de as2), es decir, el evento tiene que detectar que el mouse se esta moviendo para que por cada vez que se mueva se llame al metodo para hacer la comprobación de colisión y así poder aplicar la restricción a la ficha (restringir su posición). al parecer este es el evento: http://livedocs.adobe.com/flash/9.0_...vent:mouseMove Espero haber sido claro ;D Mis saludos.
Código:
package { import flash.events.MouseEvent; import flash.display.*; public dynamic class Ficha extends Sprite { private var nombre:String; private var color:uint; private var casilla:Casilla; private var bloqueada:Boolean;//Será true cnd no sea el turno de esa ficha private var arrastrando:Boolean; public function Ficha(p_nom:String,p_color:uint,p_bloq:Boolean, p_casilla:Casilla,p_arr:Boolean):void { super(); nombre=p_nom; color=p_color; bloqueada=p_bloq; casilla=p_casilla; arrastrando=p_arr; if (! bloqueada) { addEventListener(MouseEvent.MOUSE_DOWN,arrastrar); addEventListener(MouseEvent.MOUSE_UP,soltar); addEventListener(MouseEvent.MOUSE_MOVE,mover); } } public function getNombre():String { return nombre; } public function getColor():uint { return color; } public function setNombre(nom:String) { nombre=nom; } public function setColor(col:uint) { color=col; } public function getCasilla():Casilla { return casilla; } public function arrastrar(event:MouseEvent):void { this.startDrag(); arrastrando=true; } public function mover (event:MouseEvent,s:Sprite,s2:Sprite,s3:Sprite,s4:Sprite):void{ if (arrastrando){ restringirArrastre(this,s,s2,s3,s4); } } public function soltar(event:MouseEvent,s:Sprite,s2:Sprite,s3:Sprite,s4:Sprite):void{ arrastrando=false; restringirArrastre(this,s,s2,s3,s4); this.stopDrag(); } public function dibujarFicha(x:int,y:int):void { var s:Sprite = new Sprite (); s.graphics.beginFill(color); s.graphics.lineStyle(2,0x800080); s.graphics.drawCircle(x,y,8); this.addChild(s); } public function moverArriba(num:int, f:Ficha):void { f.y=f.y- (20*num); } public function moverAbajo(num:int,f:Ficha):void { f.y=f.y+ (20*num); } public function moverIzquierda(num:int, f:Ficha):void { f.x=f.x- (20*num); } public function moverDerecha(num:int, f:Ficha):void { f.x=f.x+ (20*num); } public function getLocalX():Number { return x; } public function getLocalY():Number { return y; } public function restringirArrastre(f:Ficha,s1:Sprite,s2:Sprite,s3:Sprite,s4:Sprite):void { if(f.hitTestObject(s1)){ removeEventListener(MouseEvent.MOUSE_DOWN,arrastrar); } if(f.hitTestObject(s2)){ removeEventListener(MouseEvent.MOUSE_DOWN,arrastrar); } if(f.hitTestObject(s3)){ removeEventListener(MouseEvent.MOUSE_DOWN,arrastrar); } if(f.hitTestObject(s4)){ removeEventListener(MouseEvent.MOUSE_DOWN,arrastrar); } } } } luego en el .fla llamo a restringirArrastre pero lo unico k consigo es que una vex clickada la ficha no se pueda soltar, es decir, que se queda "pegada" al puntero del raton.... Me podrias decir que he hecho mal por favor? gracias |
| |||
Respuesta: limite de movimiento startdrag Me parece que en el metodo restringirArrastre() en vez de remove el escuchador de eventos MOUSE_DOWN (arrastrar) debieses remover el MOUSE_MOVE (mover) y luego posicionar la ficha ó también prueba otra manera distinta a remover los escuchadores de eventos, porque lo que no tengo muy claro es como despues el evento eliminado vuelve a axistir si lo has removido, considerando que lo creas solamente en el contructor de la clase Ficha, o sea lo defines al crear el objeto luego lo elimanas y luego cuando se vuelve a presionar la ficha para arrastrarla el escuchador de eventos no existe. Espero andar cerca, mis saludos. |
| ||||
Respuesta: limite de movimiento startdrag Si,tienes toda la razón, lo que he heco es lo siguiente
Código:
public function restringirArrastre(f:Ficha,s1:Sprite,s2:Sprite,s3:Sprite,s4:Sprite):void { if (f.hitTestObject(s1)) { f.stopDrag(); } if (f.hitTestObject(s2)) { f.stopDrag(); } if (f.hitTestObject(s3)) { f.stopDrag(); } if (f.hitTestObject(s4)) { f.stopDrag(); } } Prto sigo teniendo el mismo problema de antes.... |
| ||||
Respuesta: limite de movimiento startdrag Por cierto, al ejecutarlo me sale este mensaje cada vez k muevo el raton ArgumentError: Error #1063: Discordancia del recuento de argumentos en Ficha/mover(). Se esperaba 5 y se obtuvo 1. |
| ||||
Respuesta: limite de movimiento startdrag Cita: Holapues esta claro el error, esa función recibe 5 argumentos (parámetros) pero solo le esta llegando uno! así que la solución es en donde se esta llamando a esa función pasarle los demás saludos
__________________ "Si consigues ser algo más que un hombre, si te entregas a un ideal, si nadie puede detenerte, te conviertes en algo muy diferente." Visita piggypon.com |
| |||
Respuesta: limite de movimiento startdrag Parte 1: ¿A que te refieres con "sigo teniendo el mismo problema de antes", a que "la ficha se queda pegada al puntero del mouse" o que? Describe una recreación de lo que haces paso a paso y en que momento sucede cual error o comportamiento inesperado para aclarar un poco mas el panorama. Parte 2: "Discordancia" significa que algo no concuerda o no se cumple con los requerido. "recuento de argumentos" se refiere a que los argumentos de funciones o métodos son contados (es como si flash hiciese un inventario de tu código "¿cuantos argumentos hay?, ¿cuantos se pasaron al método?, ¿eran del tipo de dato correspondiente?, ¿a que objeto corresponde ese metodo?, etc") "Ficha/mover()" significa que el error ocurre al llamar a ese método "Se esperaba 5 y se obtuvo 1" significa que 5 son los argumentos que tu definiste para mover() y solo 1 argumento fue pasado al llamar al método en algún momento y desde un objeto en particular. Entonces verifica que pases todos los argumentos correspondientes y si aun algo inesperado vuelve a suceder prueba hacer una traza (imprimir valores de expresiones) de los argumentos en el momento previo en que los pasas al método y visualizaras los valores (quizá exista un valor nulo) Buenas noches zzz... |
| ||||
Respuesta: limite de movimiento startdrag Muchas gracias a los 2. Creo que ya sé cual es el problema pero llevo toda la mañna en busca de una solucionk no encuentro... Mi código ahora mismo está asi:
Código:
package { import flash.events.MouseEvent; import flash.display.*; public dynamic class Ficha extends Sprite { private var nombre:String; private var color:uint; private var casilla:Casilla; private var bloqueada:Boolean;//Será true cnd no sea el turno de esa ficha private var arrastrando:Boolean; private var s:Sprite; private var s2:Sprite; private var s3:Sprite; private var s4:Sprite; public function Ficha(p_nom:String,p_color:uint,p_bloq:Boolean, p_casilla:Casilla,p_arr:Boolean):void { super(); nombre=p_nom; color=p_color; bloqueada=p_bloq; casilla=p_casilla; arrastrando=p_arr; if (! bloqueada) { addEventListener(MouseEvent.MOUSE_DOWN,arrastrar); addEventListener(MouseEvent.MOUSE_UP,soltar); } } public function getNombre():String { return nombre; } public function getColor():uint { return color; } public function setNombre(nom:String) { nombre=nom; } public function setColor(col:uint) { color=col; } public function getCasilla():Casilla { return casilla; } public function arrastrar(event:MouseEvent):void { this.startDrag(); arrastrando=true; addEventListener(MouseEvent.MOUSE_MOVE,mover); } public function mover(event:MouseEvent,s:Sprite,s2:Sprite,s3:Sprite,s4:Sprite):void { if (arrastrando) { restringirArrastre(this,s,s2,s3,s4); } } public function soltar(event:MouseEvent,s:Sprite,s2:Sprite,s3:Sprite,s4:Sprite):void { arrastrando=false; restringirArrastre(this,s,s2,s3,s4); this.stopDrag(); removeEventListener(MouseEvent.MOUSE_MOVE,mover); } public function dibujarFicha(x:int,y:int):void { var s:Sprite = new Sprite (); s.graphics.beginFill(color); s.graphics.lineStyle(2,0x800080); s.graphics.drawCircle(x,y,8); this.addChild(s); } public function moverArriba(num:int, f:Ficha):void { f.y=f.y- (20*num); } public function moverAbajo(num:int,f:Ficha):void { f.y=f.y+ (20*num); } public function moverIzquierda(num:int, f:Ficha):void { f.x=f.x- (20*num); } public function moverDerecha(num:int, f:Ficha):void { f.x=f.x+ (20*num); } public function getLocalX():Number { return x; } public function getLocalY():Number { return y; } public function restringirArrastre(f:Ficha,s1:Sprite,s2:Sprite,s3:Sprite,s4:Sprite):void { if (f.hitTestObject(s1)) { f.stopDrag(); } if (f.hitTestObject(s2)) { f.stopDrag(); } if (f.hitTestObject(s3)) { f.stopDrag(); } if (f.hitTestObject(s4)) { f.stopDrag(); } } } } El problema está aquí public function arrastrar(event:MouseEvent):void { this.startDrag(); arrastrando=true; addEventListener(MouseEvent.MOUSE_MOVE,mover); } la funcion mover tiene 5 parametros, uno el del evento del mouse y los otros 4 los sprite con los que se hará el hitTestObject en restringirArrastre. Supongo k una solucion sería poder ponerle los parametros a mover aqui addEventListener(MouseEvent.MOUSE_MOVE,mover); pero no estoy segura de que eso se pueda hacer... (He estado investigando por la red, y lo que he encontrado es como darle valo a los paramteros en esta sutuacion http://www.yporqueno.es/blog/pasar-p...istener-en-as3 , pero no ponerlo de forma"generica") Es por esta razon por la que luego la ficha se queda "pegada" al puntero, pork no llega a entrar en la función soltar, ya que ni siquiera ejecuta mover..... Espero que alguien pueda arrojar un poco de luz sobre todo esto.... Gracias |
| ||||
Respuesta: limite de movimiento startdrag Bueno he hallado una solución, aunque no funciona correctamente. Lo que he hecho es crear la calse Linea.as, con la que dibujo las 4 lineas del marco del tablero en la clse Ficha.as de la siguiente manera
Código:
package { import flash.events.MouseEvent; import flash.display.*; public dynamic class Ficha extends Sprite { private var nombre:String; private var color:uint; private var casilla:Casilla; private var bloqueada:Boolean;//Será true cnd no sea el turno de esa ficha private var arrastrando:Boolean; var l:Linea=new Linea(-1,-51,-1,451); var l2:Linea=new Linea(-1,451,501,451); var l3:Linea=new Linea(501,451,501,-51); var l4:Linea=new Linea(501,-51,-1,-51); public function Ficha(p_nom:String,p_color:uint,p_bloq:Boolean, p_casilla:Casilla,p_arr:Boolean):void { super(); nombre=p_nom; color=p_color; bloqueada=p_bloq; casilla=p_casilla; arrastrando=p_arr; if (! bloqueada) { addEventListener(MouseEvent.MOUSE_DOWN,arrastrar); addEventListener(MouseEvent.MOUSE_UP,soltar); } } public function getNombre():String { return nombre; } public function getColor():uint { return color; } public function setNombre(nom:String) { nombre=nom; } public function setColor(col:uint) { color=col; } public function getCasilla():Casilla { return casilla; } public function arrastrar(event:MouseEvent):void { this.startDrag(); arrastrando=true; addEventListener(MouseEvent.MOUSE_MOVE,mover); } public function mover(event:MouseEvent):void { if (arrastrando) { restringirArrastre(this); } } public function soltar(event:MouseEvent):void { arrastrando=false; restringirArrastre(this); this.stopDrag(); removeEventListener(MouseEvent.MOUSE_MOVE,mover); } public function dibujarFicha(x:int,y:int):void { var s:Sprite = new Sprite (); s.graphics.beginFill(color); s.graphics.lineStyle(2,0x800080); s.graphics.drawCircle(x,y,8); this.addChild(s); } public function moverArriba(num:int, f:Ficha):void { f.y=f.y- (20*num); } public function moverAbajo(num:int,f:Ficha):void { f.y=f.y+ (20*num); } public function moverIzquierda(num:int, f:Ficha):void { f.x=f.x- (20*num); } public function moverDerecha(num:int, f:Ficha):void { f.x=f.x+ (20*num); } public function getLocalX():Number { return x; } public function getLocalY():Number { return y; } public function restringirArrastre(f:Ficha):void { if (f.hitTestObject(l)) { f.stopDrag(); } if (f.hitTestObject(l2)) { f.stopDrag(); } if (f.hitTestObject(l3)) { f.stopDrag(); } if (f.hitTestObject(l4)) { f.stopDrag(); } }}} De este modo si funciona pero al ejecutarlo sucede una cosa extraña: si muevo la ficha despacio funciona bien, es decir, se queda parada al llegar al borde del tablero, pero si muevo la ficha rapido, traspasa el tablero, haciendo caso omiso a la restriccion...¿Por qué puede ser esto? Gracias |
| ||||
Respuesta: limite de movimiento startdrag Hola Bueno, lo intente probar pero pide la clase Casilla sin embargo se me ocurre que valides tal vez las coordenadas del mouse, pues si le pusiste correctamente los limites no debería saltarse, imagino que estas usando un cuadrado para los limites saludos
__________________ "Si consigues ser algo más que un hombre, si te entregas a un ideal, si nadie puede detenerte, te conviertes en algo muy diferente." Visita piggypon.com |
| ||||
Respuesta: limite de movimiento startdrag Muchas gracias por responder mortiprogramador. No sé a k te refieres con lo de validar las coordenadas del mouse... Para los limites estoy utilizando 4 lineas(sprite) k forman un cuadrado. Muchas gracias |
| ||||
Respuesta: limite de movimiento startdrag Hola bueno, pues me refería a validar la posición X y Y del mouse, tal vez con stage.mouseX aunque los limites debería funcionar bien, sera por las líneas?? intenta crear un Rectangle como tal a ver si te ocurre lo mismo, y bueno, llegue algo tarde al post pues han avanzado y no se que se quiere hacer, luego leere el post para enterarme saludos
__________________ "Si consigues ser algo más que un hombre, si te entregas a un ideal, si nadie puede detenerte, te conviertes en algo muy diferente." Visita piggypon.com |
| ||||
Respuesta: limite de movimiento startdrag Gracias mortiprogramador. Ya lo intenté con un Rectangle y no funcionaba, ya que las fichas siempre estan en contacto con el área del rectangulo, es por eso por lo que opté por hacerlo con 4 líneas... Si a alguien se le ocurre alguna cosa.... Gracias |
Etiquetas: |