Foros del Web » Creando para Internet » Flash y Actionscript »

limite de movimiento startdrag

Estas en el tema de limite de movimiento startdrag en el foro de Flash y Actionscript en Foros del Web. Buenas, he buscado, buscado y buscado demaciado! y no se como limitar en startdrag, o algo similar, quiero que tenga una area, hice lo del ...
  #1 (permalink)  
Antiguo 27/05/2010, 14:46
Avatar de chabri  
Fecha de Ingreso: septiembre-2009
Ubicación: Torremolinos
Mensajes: 227
Antigüedad: 15 años, 1 mes
Puntos: 17
limite de movimiento startdrag

Buenas, he buscado, buscado y buscado demaciado! y no se como limitar en startdrag, o algo similar, quiero que tenga una area, hice lo del restinccion por rectangulo pero no me sale nada, no me funciona, si alguien sabe algo se lo agradesdo un monton!
  #2 (permalink)  
Antiguo 27/05/2010, 15:39
 
Fecha de Ingreso: febrero-2008
Mensajes: 78
Antigüedad: 16 años, 9 meses
Puntos: 2
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.
  #3 (permalink)  
Antiguo 27/05/2010, 15:55
Avatar de chabri  
Fecha de Ingreso: septiembre-2009
Ubicación: Torremolinos
Mensajes: 227
Antigüedad: 15 años, 1 mes
Puntos: 17
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
  #4 (permalink)  
Antiguo 27/05/2010, 22:15
 
Fecha de Ingreso: febrero-2008
Mensajes: 78
Antigüedad: 16 años, 9 meses
Puntos: 2
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;
}
}
  #5 (permalink)  
Antiguo 30/05/2010, 11:24
Avatar de chabri  
Fecha de Ingreso: septiembre-2009
Ubicación: Torremolinos
Mensajes: 227
Antigüedad: 15 años, 1 mes
Puntos: 17
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!
  #6 (permalink)  
Antiguo 07/06/2010, 05:32
Avatar de andmai  
Fecha de Ingreso: enero-2010
Mensajes: 84
Antigüedad: 14 años, 10 meses
Puntos: 1
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
  #7 (permalink)  
Antiguo 09/06/2010, 06:37
Avatar de andmai  
Fecha de Ingreso: enero-2010
Mensajes: 84
Antigüedad: 14 años, 10 meses
Puntos: 1
Respuesta: limite de movimiento startdrag

alguien podria ayudarme? es que no veo la manera de poder solucionarlo....
gracias
  #8 (permalink)  
Antiguo 09/06/2010, 08:41
Avatar de Jime25  
Fecha de Ingreso: septiembre-2009
Ubicación: Mi casa
Mensajes: 1.213
Antigüedad: 15 años, 2 meses
Puntos: 138
Respuesta: limite de movimiento startdrag

A ver... probaste así?
Cita:
on(press){
this.startDrag(true, coordenada, coordenada, coordenada, coordenada);
}
(Donde cada coordenada es un número).
Creo que faltaban el this. y el true.
Saludos!!
__________________
Jime~

Mi blog.
Mi twitter.
  #9 (permalink)  
Antiguo 09/06/2010, 10:05
 
Fecha de Ingreso: febrero-2008
Mensajes: 78
Antigüedad: 16 años, 9 meses
Puntos: 2
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.
  #10 (permalink)  
Antiguo 10/06/2010, 11:13
Avatar de andmai  
Fecha de Ingreso: enero-2010
Mensajes: 84
Antigüedad: 14 años, 10 meses
Puntos: 1
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
  #11 (permalink)  
Antiguo 10/06/2010, 11:17
Avatar de andmai  
Fecha de Ingreso: enero-2010
Mensajes: 84
Antigüedad: 14 años, 10 meses
Puntos: 1
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
  #12 (permalink)  
Antiguo 10/06/2010, 11:48
Avatar de andmai  
Fecha de Ingreso: enero-2010
Mensajes: 84
Antigüedad: 14 años, 10 meses
Puntos: 1
Respuesta: limite de movimiento startdrag

Lo he intentado dibujando 4 lineas pero el resultado es el mismo....Alguien sabe por que?
Gracias
  #13 (permalink)  
Antiguo 10/06/2010, 12:11
Avatar de andmai  
Fecha de Ingreso: enero-2010
Mensajes: 84
Antigüedad: 14 años, 10 meses
Puntos: 1
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:
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);
			}
		}
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?


gracias
  #14 (permalink)  
Antiguo 10/06/2010, 12:37
 
Fecha de Ingreso: febrero-2008
Mensajes: 78
Antigüedad: 16 años, 9 meses
Puntos: 2
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.
  #15 (permalink)  
Antiguo 10/06/2010, 13:16
Avatar de andmai  
Fecha de Ingreso: enero-2010
Mensajes: 84
Antigüedad: 14 años, 10 meses
Puntos: 1
Respuesta: limite de movimiento startdrag

Cita:
Iniciado por mariox55 Ver Mensaje
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.
Muchas gracias mario, pero no se si te he entendido muy bien. He hecho lo siguiente:
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
  #16 (permalink)  
Antiguo 10/06/2010, 13:45
 
Fecha de Ingreso: febrero-2008
Mensajes: 78
Antigüedad: 16 años, 9 meses
Puntos: 2
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.
  #17 (permalink)  
Antiguo 10/06/2010, 14:21
Avatar de andmai  
Fecha de Ingreso: enero-2010
Mensajes: 84
Antigüedad: 14 años, 10 meses
Puntos: 1
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....
  #18 (permalink)  
Antiguo 10/06/2010, 14:25
Avatar de andmai  
Fecha de Ingreso: enero-2010
Mensajes: 84
Antigüedad: 14 años, 10 meses
Puntos: 1
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.
  #19 (permalink)  
Antiguo 10/06/2010, 23:06
Avatar de mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.805
Antigüedad: 15 años, 2 meses
Puntos: 214
Respuesta: limite de movimiento startdrag

Cita:
Iniciado por andmai Ver Mensaje
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.
Hola
pues 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
  #20 (permalink)  
Antiguo 10/06/2010, 23:19
 
Fecha de Ingreso: febrero-2008
Mensajes: 78
Antigüedad: 16 años, 9 meses
Puntos: 2
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...
  #21 (permalink)  
Antiguo 11/06/2010, 06:19
Avatar de andmai  
Fecha de Ingreso: enero-2010
Mensajes: 84
Antigüedad: 14 años, 10 meses
Puntos: 1
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
  #22 (permalink)  
Antiguo 11/06/2010, 11:18
Avatar de andmai  
Fecha de Ingreso: enero-2010
Mensajes: 84
Antigüedad: 14 años, 10 meses
Puntos: 1
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
  #23 (permalink)  
Antiguo 11/06/2010, 11:40
Avatar de mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.805
Antigüedad: 15 años, 2 meses
Puntos: 214
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
  #24 (permalink)  
Antiguo 11/06/2010, 12:03
Avatar de andmai  
Fecha de Ingreso: enero-2010
Mensajes: 84
Antigüedad: 14 años, 10 meses
Puntos: 1
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
  #25 (permalink)  
Antiguo 11/06/2010, 12:13
Avatar de mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.805
Antigüedad: 15 años, 2 meses
Puntos: 214
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
  #26 (permalink)  
Antiguo 11/06/2010, 13:26
Avatar de andmai  
Fecha de Ingreso: enero-2010
Mensajes: 84
Antigüedad: 14 años, 10 meses
Puntos: 1
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: limite, movimiento, startdrag
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 20:32.