Comunidad de diseño web y desarrollo en internet online

acceder a una clase desde linea de tiempo

Citar            
MensajeEscrito el 18 Abr 2011 11:08 am
Buenos dias, tengo una pregunta que necesito resolver, ¿hay alguna forma de acceder a una variable que esta dentro de una función que esta dentro de una clase externa, desde la linea de tiempo de flash?,

vamos tengo que acceder a la variable var sp que esat en dentro de la función Main de la clase Main y necesito acceder desde la linea de tiempo de otro archivo.


muchas gracias.

Por jsgjavi

21 de clabLevel



 

safari
Citar            
MensajeEscrito el 18 Abr 2011 11:20 am
Depende si la variable es publica o privada.

Código ActionScript :

private var nombre : String = 'Javi';
public var sobreNombre : String = 'jsgjavi';

Primero debes instanciar la clase y luego acceder dicha variable:

Código ActionScript :

var miClase : MiClase = new MiClase();
trace(miClase.sobreNombre);

Puedes usar getters/setters para hacer lo mismo (personalmente no me gustan :P) o puedes tener una variable estatica para evitar instanciar la clase....
O podrias tambien llamar a una funcion para que te regrese dicho valor aunque la propiedad sea privada:

Código ActionScript :

public function obtenerNombre() : String
{
  return nombre;
}

Y en tu linea del tiempo, creas una instancia de la clase y luego llamas la funcion...

Código ActionScript :

var miClase : MiClase = new MiClase();
trace(miClase.obtenerNombre());

En este ultimo caso, no podras alterar el valor de la variable.

Por Acreonte

Claber

1543 de clabLevel

5 tutoriales
6 articulos

Genero:Masculino  

Digital Scientist

firefox
Citar            
MensajeEscrito el 18 Abr 2011 12:27 pm
ok, pero necesitaria importar la clase? con ¿import?

Por jsgjavi

21 de clabLevel



 

firefox
Citar            
MensajeEscrito el 18 Abr 2011 12:57 pm
seria algo asi?
import Main
var miClase: Main = new Main();
trace(miClase);
trace(miClase.Main.sp);

tengo algo mal pero no se como solucionarlo.

Por jsgjavi

21 de clabLevel



 

firefox
Citar            
MensajeEscrito el 18 Abr 2011 01:24 pm
Si Main no esta en un paquete, no creo que debas importarla (la verdad nunca he creado clases sin un 'package' propio), especialmente si esta al lado del .fla.
Igual, no hace daño importarla.

Porque has puesto 'Main' en trace(miClase.Main.sp);? no tiene sentido, miClase YA es Main. Por cierto, sp debe estar declarado arriba del constructor como variable publica. Lo tienes asi?
Si es una variable local del constructor, no tendras acceso a ella.

Por Acreonte

Claber

1543 de clabLevel

5 tutoriales
6 articulos

Genero:Masculino  

Digital Scientist

firefox
Citar            
MensajeEscrito el 18 Abr 2011 01:33 pm
si, main esta un paquete, te copio como está.

Código :

package {
    import flash.display.*;
    import flash.events.*;
    import flash.geom.*;
    import flash.net.*;
    import flash.system.*;
    
    //[SWF(width="465", height="465")]
    public class Main extends Sprite {
       
   
      public function Main() {
            
      
            
         var loader:Loader = new Loader();
            loader.contentLoaderInfo.addEventListener(Event.COMPLETE, _onLoad);
            loader.load(new URLRequest("pelo1.png"), new LoaderContext(true));
        
            //graphics.beginFill(0x0);
            //graphics.drawRect(0, 0, 465, 465);
            // canvas
            addChild(_base = new Shape());
            // control points
            for (var i:int = 0; i < 4; i++) {
         
         var sp:Sprite = new Sprite();
                sp.graphics.lineStyle(2, 0xFFFF00);
                //sp.graphics.beginFill(0xFFFF00);
            sp.graphics.drawCircle(5,5,5);
                //sp.graphics.drawRect(-5, -5, 10, 10);
                sp.x = POSITIONS[ i ][ 0 ];
                sp.y = POSITIONS[ i ][ 1 ];
                sp.buttonMode = true;
                sp.addEventListener(MouseEvent.MOUSE_DOWN, _onMouseEvent);
                addChild(sp);
                _controls[ i ] = sp;
            }
        }

gracias por tu atención.

Por jsgjavi

21 de clabLevel



 

firefox
Citar            
MensajeEscrito el 18 Abr 2011 01:51 pm
No, no puedes acceder a ellos (son 4 variables llamadas sp, pero su nombre es temporal).
Parece que has hecho copy/paste sin saber que es que. No es recomendable.

Que es lo que quieres hacer? (no me digas 'acceder a sp' porque no es posible)

Por Acreonte

Claber

1543 de clabLevel

5 tutoriales
6 articulos

Genero:Masculino  

Digital Scientist

firefox
Citar            
MensajeEscrito el 18 Abr 2011 01:58 pm
la he declarado publica y he accedido a sp y he hecho un trace y me pone [object Sprite].

esto es lo que puse

Código :


function ocultar(e) {
   trace(miClase.sp);
miClase.sp.visible=false;
}

ocultar_mc.addEventListener(MouseEvent.CLICK, ocultar);


sólo quiero acceder a sp y y solo ocultarlo desde el boton que acabo de crear

Por jsgjavi

21 de clabLevel



 

firefox
Citar            
MensajeEscrito el 18 Abr 2011 02:10 pm
No entiendo. Porque no lo haces en la clase misma?
Olvidate de la linea del tiempo, ya vas por buen camino con la clase que tienes.

Y no, no existe sp como tal, lo que trace te muestra es la ultima de las sp.
Esto esta en tu clase:

Código ActionScript :

...
for (var i:int = 0; i < 4; i++) {
       
         var sp:Sprite = new Sprite();
...

Entonces hay 4 sp ya que su declaracion esta dentro de un loop.

Repito, que es lo que quieres hacer? y no repitas lo de sp, dime concretamente que es lo que quieres, desde cero.

Por Acreonte

Claber

1543 de clabLevel

5 tutoriales
6 articulos

Genero:Masculino  

Digital Scientist

firefox
Citar            
MensajeEscrito el 18 Abr 2011 02:39 pm
ya tengo hecha la conexión entre la clase externa y mi otro archivo flash, esto tiene que ser asi porque la clase es un swf cargardo encima de mi swf.
ya recibo la variable number de la clase en mi flash, y la cambio en mi swf cuando das al boton pero no remueve el sp.

Código :

package {
    import flash.display.*;
    import flash.events.*;
    import flash.geom.*;
    import flash.net.*;
    import flash.system.*;
    
    //[SWF(width="465", height="465")]
    public class Main extends Sprite {
       
   
   public var numero:Number = 5;

      public function Main() {
            
      
            
         var loader:Loader = new Loader();
            loader.contentLoaderInfo.addEventListener(Event.COMPLETE, _onLoad);
            loader.load(new URLRequest("pelo1.png"), new LoaderContext(true));
        
            //graphics.beginFill(0x0);
            //graphics.drawRect(0, 0, 465, 465);
            // canvas
            addChild(_base = new Shape());
            // control points
            for (var i:int = 0; i < 4; i++) {
         
         var sp:Sprite = new Sprite();
         if (numero==2){
            removeChild(sp)
            }
            
                sp.graphics.lineStyle(2, 0xFFFF00);
            trace(sp);
                //sp.graphics.beginFill(0xFFFF00);
            sp.graphics.drawCircle(5,5,5);
                //sp.graphics.drawRect(-5, -5, 10, 10);
                sp.x = POSITIONS[ i ][ 0 ];
                sp.y = POSITIONS[ i ][ 1 ];
                sp.buttonMode = true;
                sp.addEventListener(MouseEvent.MOUSE_DOWN, _onMouseEvent);
                addChild(sp);
                _controls[ i ] = sp;
            }
         
        }

accion que he puesto en el boton

Código :

function ocultar(e) {
   trace(miClase.numero);
   miClase.numero=2;
   }


ocultar_mc.addEventListener(MouseEvent.CLICK, ocultar);



Quiero ocultar o que desaparezca del escenario con removechild el mc dinamico sp.
gracias por tu ayuda, al menos ya se conectarme a la clase, lo que no se es si puedo modicar esa variable "numero" desde la linea de tiempo del otro flash.

Por jsgjavi

21 de clabLevel



 

firefox
Citar            
MensajeEscrito el 18 Abr 2011 02:52 pm
autocorrijo, si que puedo cambiar el valor de la variable numero pero el mc no desaparece del escenario. cuando le digo que sea 2 vuevlo a hacer un trace de (miClase.numero); y me devuelve 2 así que si que lo ha cambiado, pero el if if (numero==2){
removeChild(sp)
}
no me hace caso.

Por jsgjavi

21 de clabLevel



 

firefox
Citar            
MensajeEscrito el 18 Abr 2011 03:08 pm

jsgjavi escribió:

...
no me hace caso.

Se parece al creador... XD es que no me haces caso!
Tienes 4 sprites porque los tienes en un bucle. Puedes borrar uno pero quedan los otros 3 detras (tomando en cuenta que las posiciones son las mismas).
No me has dicho lo que quieres hacer desde cero, sigues con tu sp... :twisted:
La clase que tienes esta muy mal escrita, tiene cosas que no son necesarias y cosas a medias. Es una ensalada!
Tercera (y ultima) vez que te lo pregunto,
Que es lo que quieres hacer?

Por Acreonte

Claber

1543 de clabLevel

5 tutoriales
6 articulos

Genero:Masculino  

Digital Scientist

firefox
Citar            
MensajeEscrito el 18 Abr 2011 03:26 pm
Estoy cargando un swf dentro de otro.
el swf 2 contiene una clase externa que me saca un bitmap con el drawtriangule, eso funciona a la perfección y la clase funciona correctamente, (el moviclip sp son 4 puntos con los que puedes agrandar o estrechar la imagen), pero yo sólo copie aquí la parte que me interesaba para el problemilla.

el caso es que cargo el swf 2 con el swf1 y este swf lo programo en la linea de tiempo y he puesto un botoncillo para que me ocutara esos tiradores del bitmap, pues no me interesan para luego pues se va a hacer una captura de imagen.

estoy haciendo una aplicacion de personalización de caras.

gracias.

Por jsgjavi

21 de clabLevel



 

firefox
Citar            
MensajeEscrito el 18 Abr 2011 03:27 pm
y que es lo que quiero hacer? ocultar sp o sacarlo del escenario pero dicho desde el swf1.

Por jsgjavi

21 de clabLevel



 

firefox
Citar            
MensajeEscrito el 18 Abr 2011 04:15 pm
ah! hoy si ya entiendo mejor lo que quieres hacer.
Repito, sp no es un movieclip con 4 puntos, sino 4 movieclip distintos a menos que los pongas dentro de un sprite (o movieclip).

Código ActionScript :

package {
    import flash.display.*;
    import flash.events.*;
    import flash.geom.*;
    
    public class Main extends Sprite
    {
     
    public var contenedor : Sprite = new Sprite();
    private const NUMERO_DE_PUNTOS : uint = 4;

      public function Main() {
                       
         var loader:Loader = new Loader();
         loader.contentLoaderInfo.addEventListener(Event.COMPLETE, _onLoad);
         loader.load(new URLRequest("pelo1.png"), new LoaderContext(true));
         
         addChild(contenedor);
         addChild(_base = new Shape());
         // control points
         for (var i:int = 0; i < NUMERO_DE_PUNTOS; i++) {
         
         var sp:Sprite = new Sprite();
         sp.graphics.lineStyle(2, 0xFFFF00);
         sp.graphics.drawCircle(5,5,5);
         sp.x = POSITIONS[ i ][ 0 ];
         sp.y = POSITIONS[ i ][ 1 ];
         sp.buttonMode = true;
         sp.addEventListener(MouseEvent.MOUSE_DOWN, _onMouseEvent);
         
         contenedor.addChild(sp);
         _controls[ i ] = sp;
         }
      }
    
      public function ocultarPuntos() : void
      {
          contenedor.visible = false;
      }
    }
}

Asi los sp estan dentro de 'contenedor', para ocultarlos solo llamas la funcion ocultarPuntos() y listo el pollo :)

Por Acreonte

Claber

1543 de clabLevel

5 tutoriales
6 articulos

Genero:Masculino  

Digital Scientist

firefox
Citar            
MensajeEscrito el 20 Abr 2011 08:44 am
muchas gracias, no pude responderte antes, ¿como se llamaria a esa función desde el otro swf?

mil gracias.

Por jsgjavi

21 de clabLevel



 

safari
Citar            
MensajeEscrito el 20 Abr 2011 08:45 am
ocultar_mc.addEventListener(MouseEvent.CLICK, miClase.ocultarPuntos);

puse esto en un boton pero me dice.
Argument count mismatch on Main/ocultarPuntos(). Expected 0, got 1.

Por jsgjavi

21 de clabLevel



 

safari
Citar            
MensajeEscrito el 20 Abr 2011 09:01 am
Como lo estas llamando desde un 'listener' entonces la funcion recibe el parametro 'MouseEvent' pero la funcion no tiene ningun parametro declarado.
Para arreglarlo, solo le dices a la funcion 'hey, te llamaran y te daran un mouseevent como parametro'

Código ActionScript :

      public function ocultarPuntos(event : MouseEvent) : void 
      { 
          contenedor.visible = false; 
      } 

y listo! :)

Por Acreonte

Claber

1543 de clabLevel

5 tutoriales
6 articulos

Genero:Masculino  

Digital Scientist

firefox
Citar            
MensajeEscrito el 20 Abr 2011 09:05 am
Joder, cuando me das clases particulares.
Aunque, fallo no da, pero sigue sin ocultarme los tiradores.
de todas formas muchas gracias por tu tiempo.

Por jsgjavi

21 de clabLevel



 

safari
Citar            
MensajeEscrito el 20 Abr 2011 09:11 am
¿Te puedo pasar los archivos y me lo echas un ojo?

Por jsgjavi

21 de clabLevel



 

safari
Citar            
MensajeEscrito el 20 Abr 2011 09:55 am

jsgjavi escribió:

¿Te puedo pasar los archivos y me lo echas un ojo?

Fuese mejor si vemos como arreglamos el problema aca. Asi cualquier solucion puede ayudar a otros en el futuro.

Hay que seguir probando.

Que sucede si tratas de oculatar el contenedor despues de agregar los sp?
por ejemplo:

Código ActionScript :

//...
          contenedor.addChild(sp);
         _controls[ i ] = sp;
     }
     contenedor.visible = false;

Si los oculta, significa que los sp estan en 'contenedor' y el problema esta en otro lado. Otra opcion es, en ocultarPuntos, puedes probar tambien removeChild(contenedor);.

Por Acreonte

Claber

1543 de clabLevel

5 tutoriales
6 articulos

Genero:Masculino  

Digital Scientist

firefox
Citar            
MensajeEscrito el 20 Abr 2011 10:17 am
ok, es cierto que esto le puede ser necesario a más gente.
posicionando el contenedor como tu dices, si me hace invisible los tiradores, pero claro hay ya no está dentro de la función de ocultar.


removeChild(contenedor) dentro de la funcion, desde el boton del swf 1 tampoco hace nada.

Por jsgjavi

21 de clabLevel



 

safari
Citar            
MensajeEscrito el 20 Abr 2011 10:19 am
al poner removeChild dentro de la funcion ocultarPuntos me da el error

ArgumentError: Error #2025: The supplied DisplayObject must be a child of the caller.
at flash.display::DisplayObjectContainer/removeChild()

Por jsgjavi

21 de clabLevel



 

safari
Citar            
MensajeEscrito el 20 Abr 2011 10:37 am
Tienes la funcion ocultarPuntos en Main? o donde la has puesto?

Por Acreonte

Claber

1543 de clabLevel

5 tutoriales
6 articulos

Genero:Masculino  

Digital Scientist

firefox
Citar            
MensajeEscrito el 20 Abr 2011 10:48 am
si, la funcion la tengo dentro de main

te copio todo el codigo

Código :


package {
    import flash.display.*;
    import flash.events.*;
    import flash.geom.*;
    import flash.net.*;
    import flash.system.*;
    
    //[SWF(width="465", height="465")]
    public class Main extends Sprite {
       
   public var numero: Number=0;
   public var contenedor : Sprite = new Sprite(); 
   
    private const NUMERO_DE_PUNTOS : uint = 4;    

      public function Main() {
            
      
            
         var loader:Loader = new Loader();
            loader.contentLoaderInfo.addEventListener(Event.COMPLETE, _onLoad);
            loader.load(new URLRequest("pelo1.png"), new LoaderContext(true));
        
            //graphics.beginFill(0x0);
            //graphics.drawRect(0, 0, 465, 465);
            // canvas
         addChild(contenedor); 
            addChild(_base = new Shape());
            // control points
           for (var i:int = 0; i < NUMERO_DE_PUNTOS; i++) { 
         
         var sp:Sprite = new Sprite();
         
                sp.graphics.lineStyle(2, 0xFFFF00);
            trace(sp);
                //sp.graphics.beginFill(0xFFFF00);
            sp.graphics.drawCircle(5,5,5);
                //sp.graphics.drawRect(-5, -5, 10, 10);
                sp.x = POSITIONS[ i ][ 0 ];
                sp.y = POSITIONS[ i ][ 1 ];
                sp.buttonMode = true;
                sp.addEventListener(MouseEvent.MOUSE_DOWN, _onMouseEvent);
                //addChild(sp);
            
              contenedor.addChild(sp); 
                _controls[ i ] = sp;
               contenedor.visible = true; 

            }
         
      
        }
      
         public function ocultarPuntos(event : MouseEvent) : void  { 
     numero = 1;
     trace(numero);
      contenedor.visible = false; 
      }
    
      
      
        private const POSITIONS:Array = [[ 20, 20 ], [ 250, 20 ], [ 20, 250 ], [ 250, 270 ]];
        private var _base:Shape;
        private var _bmp:Bitmap;
        private var _currentDrag:Sprite;
        private var _controls:Array /*Sprite*/ = [];
        
        private function _onMouseEvent(e:MouseEvent):void {
            switch (e.type) {
                case MouseEvent.MOUSE_DOWN:
                    _currentDrag = (e.currentTarget as Sprite);
                    _currentDrag.startDrag();
               
                    stage.addEventListener(MouseEvent.MOUSE_MOVE, _onMouseEvent);
                    stage.addEventListener(MouseEvent.MOUSE_UP, _onMouseEvent);
                    break;
                case MouseEvent.MOUSE_MOVE:
                    _draw();
                    e.updateAfterEvent();
               
                    break;
               case MouseEvent.MOUSE_UP:
                    _currentDrag.stopDrag();
                    stage.removeEventListener(MouseEvent.MOUSE_MOVE, _onMouseEvent);
                    stage.removeEventListener(MouseEvent.MOUSE_UP, _onMouseEvent);
                    break;
            }
        }
        

Por jsgjavi

21 de clabLevel



 

safari
Citar            
MensajeEscrito el 26 Abr 2011 07:53 am
Buenos dias Acreonte, puedes echarme una mano sobre esto.

Por jsgjavi

21 de clabLevel



 

safari

 

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