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

Ayuda con Sprite en AS3

Estas en el tema de Ayuda con Sprite en AS3 en el foro de Flash y Actionscript en Foros del Web. Necesito hacer un Sprite que sea un circulo con una letra en el medio y despues programarle los eventos startDrag y StopDrag. var c:Sprite = ...
  #1 (permalink)  
Antiguo 29/12/2008, 12:09
 
Fecha de Ingreso: diciembre-2008
Mensajes: 5
Antigüedad: 9 años
Puntos: 0
Ayuda con Sprite en AS3

Necesito hacer un Sprite que sea un circulo con una letra en el medio y despues programarle los eventos startDrag y StopDrag.

var c:Sprite = new Sprite();
var letra:TextField=new TextField();
c.graphics.beginFill(0xFFFFFF);
c.graphics.drawCircle(100, 100, 50);
c.addEventListener(MouseEvent.MOUSE_DOWN,arrastrar );
c.addEventListener(MouseEvent.MOUSE_UP,soltar);
letra.text="A";
letra.selectable=false;
c.addChild(letra);
addChild(c);
...

El problema que tengo es que al intentar arrastrar el circulo si lo hago arrastrandolo por la letra no me lo permite. Solo me deja arrastrarlo si lo hago anclandolo por la parte del circulo donde no esta la letra

Alguien sabe como podria solucionar esto??
  #2 (permalink)  
Antiguo 29/12/2008, 13:47
Avatar de jahepi
Colaborador
 
Fecha de Ingreso: diciembre-2004
Ubicación: Querétaro
Mensajes: 1.124
Antigüedad: 13 años
Puntos: 43
Respuesta: Ayuda con Sprite en AS3

Hola asturkon35 !

Esto pasa por la propagación del evento, si le has asignado a tu instancia 'c' que escuche por el evento mousedown, también será aplicado a las intancias internas, en este caso sería la instancia 'letra'.

Cuando presionas el mouse sobre la instancia 'letra', el evento se propaga hasta la función arrastrar, el evento propagado tiene una atributo target que hace referencia al objeto que presionaste.

Si presionas la instancia letra esto es lo que pasa:

Código actionscript:
Ver original
  1. function arrastrar(evt:MouseEvent):void {
  2.     trace(evt.target); //Event.target hace referencia a la instancia letra.
  3.     evt.target.startDrag(); //Como la instancia letra no cuenta con el método startDrag(), el programa lanza una excepción.
  4. }

Si le das click en cambio al sprite, todo funcionara perfecto porque este si cuenta con el método startDrag.

Una forma de solucionarlo es decirle a tu instancia 'letra' que no propage los eventos generados por el mouse, esto lo haces con el atributo mouseEnabled.

Deberás cambiarlo a false:
Código actionscript:
Ver original
  1. var c:Sprite = new Sprite();
  2. var letra:TextField=new TextField();
  3. letra.mouseEnabled = false;  //Aquí el truco
  4. c.graphics.beginFill(0x000000);
  5. c.graphics.drawCircle(100, 100, 50);
  6. c.addEventListener(MouseEvent.MOUSE_DOWN,arrastrar);
  7. c.addEventListener(MouseEvent.MOUSE_UP,soltar);
  8. letra.text="A";
  9. letra.selectable=false;
  10. c.addChild(letra);
  11. addChild(c);
  12.  
  13. function arrastrar(evt:MouseEvent):void {
  14.     evt.target.startDrag();
  15. }
  16.  
  17. function soltar(evt:MouseEvent):void {
  18.     evt.target.stopDrag();
  19. }

Otra forma, sería que cambiaras event.target, por la instancia 'c', en tus 2 funciones arrastrar y soltar:

Código actionscript:
Ver original
  1. function arrastrar(evt:MouseEvent):void {
  2.     c.startDrag();
  3. }
  4.  
  5. function soltar(evt:MouseEvent):void {
  6.     c.stopDrag();
  7. }


Un saludote !
__________________
Una contraseña es como la ropa interior. No deberías dejarlas afuera a la vista de otras personas, deberías cambiarla regularmente, y ni se te ocurra prestarla a extraños.
  #3 (permalink)  
Antiguo 29/12/2008, 15:03
 
Fecha de Ingreso: diciembre-2008
Mensajes: 5
Antigüedad: 9 años
Puntos: 0
Respuesta: Ayuda con Sprite en AS3

Cita:
Iniciado por jahepi Ver Mensaje
Hola asturkon35 !

Esto pasa por la propagación del evento, si le has asignado a tu instancia 'c' que escuche por el evento mousedown, también será aplicado a las intancias internas, en este caso sería la instancia 'letra'.

Cuando presionas el mouse sobre la instancia 'letra', el evento se propaga hasta la función arrastrar, el evento propagado tiene una atributo target que hace referencia al objeto que presionaste.

Si presionas la instancia letra esto es lo que pasa:

Código actionscript:
Ver original
  1. function arrastrar(evt:MouseEvent):void {
  2.     trace(evt.target); //Event.target hace referencia a la instancia letra.
  3.     evt.target.startDrag(); //Como la instancia letra no cuenta con el método startDrag(), el programa lanza una excepción.
  4. }

Si le das click en cambio al sprite, todo funcionara perfecto porque este si cuenta con el método startDrag.

Una forma de solucionarlo es decirle a tu instancia 'letra' que no propage los eventos generados por el mouse, esto lo haces con el atributo mouseEnabled.

Deberás cambiarlo a false:
Código actionscript:
Ver original
  1. var c:Sprite = new Sprite();
  2. var letra:TextField=new TextField();
  3. letra.mouseEnabled = false;  //Aquí el truco
  4. c.graphics.beginFill(0x000000);
  5. c.graphics.drawCircle(100, 100, 50);
  6. c.addEventListener(MouseEvent.MOUSE_DOWN,arrastrar);
  7. c.addEventListener(MouseEvent.MOUSE_UP,soltar);
  8. letra.text="A";
  9. letra.selectable=false;
  10. c.addChild(letra);
  11. addChild(c);
  12.  
  13. function arrastrar(evt:MouseEvent):void {
  14.     evt.target.startDrag();
  15. }
  16.  
  17. function soltar(evt:MouseEvent):void {
  18.     evt.target.stopDrag();
  19. }

Otra forma, sería que cambiaras event.target, por la instancia 'c', en tus 2 funciones arrastrar y soltar:

Código actionscript:
Ver original
  1. function arrastrar(evt:MouseEvent):void {
  2.     c.startDrag();
  3. }
  4.  
  5. function soltar(evt:MouseEvent):void {
  6.     c.stopDrag();
  7. }


Un saludote !
Ahora si
Mil gracias no solo por la solución sino también por la explicación, muy clara e instructiva

Un saludote a ti
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




La zona horaria es GMT -6. Ahora son las 13:41.