Comunidad de diseño web y desarrollo en internet online

ACCESO A VARIABLES DEL SWF PRINCIPAL

Citar            
MensajeEscrito el 01 Dic 2008 08:51 pm
Hola a todos:

¿Cómo puedo acceder a una variable de una película principal una vez que he cargado un nuevo swf?

En AS2 lo que hacía era cargar un swf dentro un clip de película que hacía las funciones de contenedor o cargador de la película (ya sabés, Loadmovie....). Después, con _parent podía acceder a las variables de la película principal.

Ahora con AS3 ¿cómo lo hago? Al utilizar la clase loader en una película llamada 'A' ¿estoy cargando realmente una película 'B' dentro de 'A' o bien 'B' reemplaza a 'A'?

Gracias de antemano.

Por joseb

20 de clabLevel



 

msie
Citar            
MensajeEscrito el 02 Dic 2008 05:14 am
estas cargando b dentro de a

y ocupas la propiedad parent en AS3 y no _parent como en AS2

Por Gz.Francisco

378 de clabLevel



Genero:Masculino  

Programador economista y buzo

firefox
Citar            
MensajeEscrito el 02 Dic 2008 12:22 pm
Es exactamente igual que antes, sólo hay que tener en cuenta que "loader" tienes un DisplayObject dentro.
Vamos, que, si miclip es un MC que está ya en el escenario. Lo que tendrías es algo como

Código :

miclip
   |-----loader
            |------content (secundario.swf)

Vamos, el contenido cargado de un Objeto "loader" se carga DENTRO de content. Por eso, desde "secundario.swf",
parent es el propio loader,
parent.parent será miclip y
parent.parent.parent será el Stage

Claro que hay que hacer una "conversión de cast"

Código ActionScript :

//desde secundario.fla
trace(MovieClip(parent.parent.parent).miVariable)


Al revés, si queremos acceder a un MC de "secundario.swf" (p.e. mc_secundario) DESDE la película principal, deberíamos escribir

Código ActionScript :

cargador.content.mc_secundario


Y sí, si miclip, miclip.loader ó cargador.content, tienen una xscale<1, o una rotation<>0 todo se traslada igual.

NOTA: Si "mimc" no tiene ninguna otra función que la de mostrar un .swf, puedes hacer el addChild(cargador) sobre el porpio stage
NOTA2:No sé el motivo por el que quieres acceder al Stage desde "secundario.swf"

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 02 Dic 2008 05:40 pm
He intentado varias cosas pero no lo he logrado. La película carga perfectamente (se visualiza) pero no logro acceder a la variable de la película principal.

Éste es el código de la película principal, desde la que se llama a la película "sedundario.swf" por medio de un botón:

import flash.display.Loader;
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.events.Event;
import flash.net.URLRequest;

var miVariable:String = "mensaje de prueba";

function cargar(e:Event){
var película:URLRequest = new URLRequest("secundario.swf");
var cargador:Loader = new Loader();
cargador.load(película);
//cargador.load(new URLRequest = new URLRequest("dos.swf"));

cargador.contentLoaderInfo.addEventListener(Event.COMPLETE,peliCargada);

function peliCargada(e:Event):void{
addChild(cargador);
}
}

carga_btn.addEventListener(MouseEvent.CLICK, cargar);

Puede incluso que me haya pasado importando clases, no sé. El caso es que ¿qué tengo que escribir en la película cargada para que se muestre el valor de "miVariable? He preparado un texto dinámico que tiene como nombre de instancia "texto":

texto.text = //¿Que pongo aquí?

Por joseb

20 de clabLevel



 

msie7
Citar            
MensajeEscrito el 02 Dic 2008 06:04 pm
Supongo que la variable tendrá que ser pública

Código ActionScript :

public var miVariable:String = "mensaje de prueba";

Así debería funcionar un

Código ActionScript :

//en tu "secundario.fla" donde tienes tu caja de texto
texto.text=(MovieClip(parent.parent).miVariable;

Pero DEBES añadir "cargador" al Stage -Sí ese addChild- ANTES incluso de mandar a cargar la película (hasta entonces no tiene "padre")

NOTA: Hay algo que no me gusta de tu código y es dónde defines cargador, realmente no tiene mucha importancia.
¿dónde defines "cargador"? Lo estás definiendo DENTRO de la función "cargar"
¿dónde tendrá sentido usarlo? pues EXCLUSIVAMENTE DENTRO de la función "cargar". Es ese "var" del que se hablo en este tip

Definámosló fuera y demoslé valor dentro de la función

Código ActionScript :

var miVariable:String = "mensaje de prueba";
//<----aquí--------------->
var cargardor:Loader;

function cargar(e:Event){
var película:URLRequest = new URLRequest("secundario.swf");
cargador:Loader = new Loader(); //<--observa que le he quitado el "var"
//añadimos al Stage cargado "antes" de empezar la carga.
addChild(cargador)
cargador.load(película);
cargador.contentLoaderInfo.addEventListener(Event.COMPLETE,peliCargada);
}
//te saco la función "peliCargada" de la función cargar
function peliCargada(e:Event):void{
}
carga_btn.addEventListener(MouseEvent.CLICK, cargar);

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 02 Dic 2008 07:51 pm
Muchas gracias, funciona. Sólo he tenido que quitar 'cargador:Loader = new Loader();' que estaba dentro de la función cargar pues me daba error.

Una cosa: ¿qué utilidad puedo darle a la función que se llama cuando la película se ha descargado completamente? Lo comento porque está vacía y creía que tenía que esperar a que la descarga fuera completa para entonces utilizar addChild.

Gracias de nuevo.

Por joseb

20 de clabLevel



 

msie7
Citar            
MensajeEscrito el 03 Dic 2008 07:31 am
Lo del error es que era

Código ActionScript :

cargador=new Loader()

(sólo cuando declaramos una variable le damos el tipo)

Respecto a la utilidad o no depende de lo que quieras hacer: puedes darle utilidad o no e igualmente puedes añadir el listener o no.
Sí hay algo típico que se suele hacer y es usarlo para enablar/disablar botones. Vamos, cuando pulsamos el botón disablamos todos los botones, para que no estén dando repetidamente a los botones antes de cargar, y es en la función init cuando los enablamos de nuevo. A veces, hacemos que el loader esté en una esquina y con xscale=yscale=.1 y en ese momento hacemos un tween para ubicarlo en su posición, etc, o tenemos un MC con el típico "cargando" y en la función init lo hacemos invisible, o cambiamos el cursor del ratón por un "reloj de arena", o.... Vamos, que la imaginación es libre y, repito, podemos o no declarar el evento.

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 03 Dic 2008 07:47 am
Entendido.

Una última cosa: No consigo visualizar el contenido de la variable si ésta es un XML.

//En principal:
miVariable:XML = <nodo></nodo>;

//En secundario:
texto.text = MovieClip(parent.parent).miVariable;

Mi idea es crear en una película padre (index, principal, ...) una variable XML para que después las películas cargadas vayan agregándole nodos y atributos. Finalmente, de vuelta a la película principal, se dará la opción de guardar todos los cambios realizados en un solo archivo XML.

Gracias.

Por joseb

20 de clabLevel



 

msie7
Citar            
MensajeEscrito el 03 Dic 2008 08:54 am
Es que si tu variable es un XML (o un objeto, o un Array), no muestra nada, siempre puedes usar el método "toString()" si quieres asegurarte de que ha cogido la variable

Código ActionScript :

texto.text = MovieClip(parent.parent).miVariable.toString();

Aunque lo más probable es que te aparezca algo como [object object] -lo debería probar-
De cualquier modo, se suele hacer en dos pasos para no tene que repetir siempre lo de MovieClip(parent.parent).miVariable

Código ActionScript :

var tmp:XML=MovieClip(parent.parent).miVariable
texto.text=tmp.toString()
//ó lo que quiera que hagamos con tmp, lo hará con "miVariable"(*)
tmp.replace("id","nombre");

(*)Es lo que se llama "tener una variable que hace referencia a un ...."

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 03 Dic 2008 01:42 pm
Sí, ya probé convertir en una cadena la expresión con toString(), pero sigue sin funcionar. También he probado en dos pasos (que es lo mismo) y tampoco funciona. ¿A qué puede deberse?

Si no logro leear el archivo XML creado en la principal no podré agregar más datos a ese archivo (como es lógico, me lanza errores).

Saludos.

Por joseb

20 de clabLevel



 

msie7
Citar            
MensajeEscrito el 04 Dic 2008 08:33 am
Perdona Joseb, todo el rato he estado dándole vueltas y se me ha olvidado lo más importante: No tenemos padre hasta que no se ñada al Stage. Vamos, imaginemos un secundario.swf

Código ActionScript :

package  
{
   import flash.text.TextField;
   import flash.text.TextFieldAutoSize;
   import flash.display.MovieClip;
   import flash.events.Event;
   import flash.display.Loader;
   public class Secundario extends MovieClip 
   {
      private var texto:TextField;
      public function Secundario() 
      {
         texto= new TextField();
         texto.autoSize = TextFieldAutoSize.LEFT;
         addChild(texto)
         addEventListener(Event.ADDED_TO_STAGE, getReady);

         function getReady(event:Event = null):void{
            texto.text = (parent is Loader)?MovieClip(parent.parent).XMLvariable: "Hola Mundo";
         }
      }
   }
}

Vale, lo del "if condicional" no es necesario.
Si tenemos un Prueba como

Código ActionScript :

package  
{
   import flash.display.MovieClip;
   import flash.display.Loader;
   import flash.net.URLRequest;

   import flash.display.LoaderInfo;
   import flash.system.Security;

   public class Prueba extends MovieClip
   {
      public   var XMLvariable:String = new XML("<galeria><item id='10'/></galeria>"); 
      private var url:String = "../secundario/secundario.swf";
      private var loader:Loader;

      public function Prueba() 
      {
                     loader=new Loader();
                     var request:URLRequest = new URLRequest(url);
                     loader.load(request);
           addChild(loader);
      }
   }
}

Veremos en la caja de texto el XML

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 04 Dic 2008 11:05 am
Pequeños ajustes:
1.-NO es toString(), sino toXMLString()

Código ActionScript :

//en Secundario.as
texto.text = MovieClip(parent.parent).XMLvariable.toXMLString();

2.-NO es un String sino un XML

Código ActionScript :

//en Prueba.as
public   var XMLvariable:XML= new XML("<galeria><item id='10'/></galeria>");

Por Eliseo2

710 de clabLevel



 

firefox

 

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