Comunidad de diseño web y desarrollo en internet online

getObjectsUnderPoint(), hitTestObject()

Citar            
MensajeEscrito el 16 Jun 2009 10:20 am
Buenas!
No consigo que funcionen estas dos funciones que pongo en el título del mensaje. Os pongo un pequeño código sencillo del uso que les estoy dando y luego os comento:

Código ActionScript :

private funcion estudiarZonas():void{
  var cv:Canvas = new Canvas();
  cv.width = 600;
  cv.height = 350;

  var fig:Figura = new Figura(0xffffff, new Array(0,0, 600,0, 600,350, 0,350));
  fig.name = "zona2";
  cv.addChild(fig);

  var p:Point = new Point(36, 143);
  var objetos:Array = cv.getsObjectsUnderPoint(p);
  trace(objetos + "--> Longitud: " + objetos.length);

  if(cv.hitTestObject(fig))
   trace("La Figura fig esta contenida en el Canvas cv");
}


Figura es un rectangulo dibujado con drawpath() que como veis ocupa todo el canvas. (He probado a añadir muchos más objetos y el resultado siempre es nulo).

La función getsObjectsUnderPoint() no me devuelve ningún objeto y hitTestObject() siempre me devuelve "false".
He probado con la función cv.areInaccessibleObjectsUnderPoint(p); y también me devuelve "false". He hecho la conversión del punto tanto p = cv.localToGlobal(p) como p = cv.globalToLocal(p) antes de llamar a getsObjectsUnderPoint y siempre me devuelve 0 objetos.

Leyendo en foros, buscadores y de mas... Veo que a la gente si que le funcionan. ¿Qué estoy haciendo mal?

Gracias!
Un saludo a todos!

Por Kárites

25 de clabLevel



 

msie8
Citar            
MensajeEscrito el 16 Jun 2009 11:57 am
Chic@s me respondo sola!!
El problema estaba en los tiempos de creación! Me llamaba antes a las fuciones de que estuviese metida la figura ene l canvas y por ello no aparecian objetos.

Lo solucione con:

Código ActionScript :

fig.addEventListener(FlexEvent.CREATION_COMPLETE, comparar);

private function comparar(evento:FlexEvent):void{
    //En esta funcion llamo a getObjectsUnderPoint()
}


^^ ^^ ^^

Por Kárites

25 de clabLevel



 

msie8
Citar            
MensajeEscrito el 17 Jun 2009 06:07 pm
Me precipité en mi respuesta.... En efecto, la función getObjectsUnderPoint() funciona, pero cuando le da la gana... por así decirlo...

Mi situación es la siguiente:
Tengo un canvas "Estadistica" que ocupa toda la aplicacion. Dentro un componente "Accordion" en el que hay un canvas "canvasZonas" que contiene una imagen de una pista de baloncesto y un boton.
Mi aplicación va a recibir una serie de coordenadas y necesito estudiar cuantos de esos puntos están dentro de la zona, cuales dentro de triple y así en diversas partes de la pista...
La idea que estoy implementando, es dibujar esas zonas manualmente mediante drawPath(), y esto lo hago en la clase "Figura" que extiende de la clase "Image". Entonces el objeto "Figura" lo meto en el canvas "canvasZonas".
Una vez hecho esto, utilizo la funcion punto = canvasZonas.getObjectsUnderPoint(punto); para ver si debajo de ese punto se encuentra el objeto "Figura".



El problema que me encuentro es que no me reconoce los objetos que hay debajo del punto. En ocasiones me dice que hay un objeto [Bitmap] que imagino será la imagen de la cancha pero es lo único que me aparece. De la única manera que me reconoce el objeto "Figura" es cuando hago punto = canvasZonas.localToGlobal(punto);, pero claro las coordenadas del punto se vuelven globales, pero las de el objeto "Figura" no, por lo que el resultado tampoco es correcto.

Aquí os pongo un poco la estructura y el código que tengo para ver si alguien me ve algún error y me puede ayudar con esto... Llevo ya una semana con el tema y estoy por tirar el ordenador por la ventana... :(

Código Flex :

<mx:Canvas id="Estadistica" creationPolicy="all">
   <mx:Accordion>
         ...
         <mx:Canvas id="canvasZonas" label="Zonas">
               <mx:Image source="..." id="cancha_baloncesto.png"/>
               <mx:Button label="Estudiar zonas" click="estudiarZona(event);"/>
         </mx:Canvas>
    </mx:>ccordion>
</mx:Canvas>


Esta función se ejecuta al principio de la aplicación:

Código ActionScript :

private function crearFigurasZonas():void{
   
   //Creamos la zona1
   var figura_zona1:Figura = new Figura(0xffffff, new Array(0,106, 126,134, 126,216, 0,244));
   figura_zona1.name = "zona1";
   figura_zona1.visible = true;
 
   
   zonas[1] = figura_zona1;
   canvasZonas.addChildAt(zonas[1], 0);
}


"zonas" es un array en el que voy a ir metiendo todas las figuras que vaya creando.
Cuando clickeo el boton que está en "canvasZonas" se ejecuta la siguiente funcion:

Código ActionScript :

private function estudiarZona(evento:MouseEvent):void{
   var i:uint, j:uint;
   var objetos:Array;
   var cont:int = 0;
   var num_zona:uint = int(evento.currentTarget.name);
   
   zonas[num_zona].visible = true;
   trace(canvasZonas.getChildren());

   
   for(i=0; i<Jugador[JUG_SELECTED].longitud.length; i++){
      var long:int = Jugador[JUG_SELECTED].longitud[i];
      var lat:int = Jugador[JUG_SELECTED].latitud[i];
      var p:Point = new Point(long, lat); trace(p);
      //p = canvasZonas.localToGlobal(p); trace(p);      
      

      objetos = canvasZonas.getObjectsUnderPoint(p);
                                trace("Longitud " + objetos.length + " " + objetos);
      for(j=0; j<objetos.length; j++){
         if(objetos[j].name == zonas[num_zona].name)
            cont++;
      }
      
   }
   
   trace("Jugador " + JUG_SELECTED + ": " + cont + " / " + Jugador[JUG_SELECTED].longitud.length);
}


En esta funcion, se van obteniendo los distintos puntos a estudiar (longitud, latitud) del jugador seleccionado y como veis hago la comprobación de si debajo de ese punto se encuentra el objeto "Figura" que quiero estudiar.


He probado todo tipo de cosas... y ya no sé qué más probar...
Ojalá alguno podais ayudarme.
Millones de gracias!

Un saludo!

Por Kárites

25 de clabLevel



 

msie8
Citar            
MensajeEscrito el 17 Jun 2009 08:34 pm
El método getObjectsUnderPoint funciona con un punto que represente una coordenada del stage (no una coordenada dentro del DisplayObjectContainer), si deseas utilizar una coordenada dentro de un displayObjectContainer debes utilizar localToGlobal o globalToLocal según corresponda, para que el resultado final sea una coordenada del stage.

Por elchininet

Claber

3921 de clabLevel

17 tutoriales

Genero:Masculino  

Front-end developer at Booking.com

firefox
Citar            
MensajeEscrito el 18 Jun 2009 07:54 am
Lo sé... y creeme que he probado todo tipo de conversiones: localToGlobal, globalToLocal, localToContent, globalToContent, contentToLocal y contentToGlobal
y con la única que he conseguido hacer algo es con "localToGlobal" pero claro, mi problema es que tanto la imágen como las figuras estan en el "canvasZonas" y no en el stage principal, por lo que las coordenadas que me genera "localToGlobal" no coinciden al 100% con ellas y tampoco me sirve...

Según recojo las coordenadas son como las necesito para compararlas con el contenedor "canvasZonas", entonces cualquier conversión que haga me deja las coordenadas fuera de ese contenedor. (A excepción de las funciones que tienen que ver con "content" que no he conesguido encontrar ninguna ayuda en internet que me expliquen con exactitud para que sirven).

Gracais por la respuesta.
Salu2!

Por Kárites

25 de clabLevel



 

msie8
Citar            
MensajeEscrito el 18 Jun 2009 09:07 am
@Kárites no has entendido, puedes tomar cualquier coordenada de dentro de cualquier child del DisplayObjectContainer y hacer la comparación para ver si están tocando la zona, lo que no la puedes utilizar directamente, debes convertirla primero a global (del stage) con localToGlobal y después aplicar el método getObjectsUnderPoint si el objeto está en esta en el arreglo obtenido, puedes decir que las coordenadas que tomaste (las de dentro del DisplayObjectContainer) están tocando el objeto. No deberás utilizar las coordenadas del Stage para más nada que para aplicar el método no para utilizarlas después.

Por elchininet

Claber

3921 de clabLevel

17 tutoriales

Genero:Masculino  

Front-end developer at Booking.com

firefox
Citar            
MensajeEscrito el 18 Jun 2009 10:46 am
siento ser tan cazurrilla xo esq hablo desde la desesperación... :(
Creo que me has dado la idea final, porque ya me empiezan a salir cosas coherentes:

Código ActionScript :

var p:Point = new Point(long, lat);
p = canvasZonas.localToGlobal(p);
objetos = stage.getObjectsUnderPoint(p);


Mi problema, entonces, era que estaba haciendo esto:

Código ActionScript :

var p:Point = new Point(long, lat);
p = canvasZonas.localToGlobal(p);
objetos = canvasZonas.getObjectsUnderPoint(p);



Muchas gracias!!! De momento las pruebas que estoy haciendo me están saliendo coherentes... Seguiré en ello, a ver si esta vez es la definitiva!

Gracias de nuevo.
Un saludo!!

Por Kárites

25 de clabLevel



 

msie8
Citar            
MensajeEscrito el 18 Jun 2009 11:19 am
Puedes hacerlo de las dos maneras, lo que el punto debes convertirlo a un punto del stage siempre. Especificar el método en el stage o en el displayObjectContainer sólo tendrá una diferencia y es que el primero te dará un arreglo con todos los objetos incluidos los que no sean hijos de canvasZonas y de la segunda manera sólo te devolverá los que sean hijos de canvasZonas en adelante.

Por elchininet

Claber

3921 de clabLevel

17 tutoriales

Genero:Masculino  

Front-end developer at Booking.com

firefox

 

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