Comunidad de diseño web y desarrollo en internet online

Duda: ¿Es posible modificar loader desde su contenido?

Citar            
MensajeEscrito el 09 Oct 2012 11:34 pm
(creo que soy lento.. por que sufrí para resumir mi conflicto mental en esa pregunta ._ .')

bueno, estoy haciendo una pequeña aplicación en as3 y entre tantas dudas que he resuelto aquí y por alla, pues ya se presento una que me tiene loco e_o, la verdad creo que la razón principal es que no se si es posible.

verán mis queridos dioses, tengo una variable de la clase loader que me carga un swf, en ese swf cargado, hay una serie de botones, la función que quiero para uno de esos botones es que me cambie el contenido del mismo swf donde el se encuentra (un reload) aun cuando el mismo (botón) se descargue, en resumen seria como un... "atrás"

es algo como..:

01.swf -> loader [02.swf]

02.swf -> loader [03.swf] (debe poder modificar la variable loader)

de antemano.. gracias u-u

Por desfaz

10 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 10 Oct 2012 09:17 am
BuenAS:

Lo primero, esto que vas a hacer, aunque se puede, NO LO HAGAS. Suele dar más problemas que otra cosa.

En 02.swf puedes acceder al loader que lo cargar a través de:

this.parent

y si has añadido el loader a un Sprite/MovieClip, puedes acceder a el a través de:

this.parent.parent.

Para acceder a las propiedades de tu Sprite deberías tipificarlo para que no te de errores de compilacion;, algo así:

(this.parent.parent as MiSprite).boton

Esto lo que hace es decirle al compilador que el 'abuelo' ;) de tu swf es de la clase MiSprite -por ejemplo, cambialo en tu caso- y tiene una propiedad pública llamada boton.

Pero dicho todo esto, repito que NO LO HAGAS ASÍ. Si en un futuro este swf lo cargas (u otra persona lo carga) desde otro pueden empezar a aparecer cosas raras sin saber muy bien porqué.

Es mejor hacerlo de otra forma:

En el swf que carga 02.swf distribuye un evento algo así:

Código ActionScript :

dispatchEvent(new Event("comunicarConSwf"));


y en el swf cargador añade un listener para dicho oyente:

Código ActionScript :

addEventListener("comunicarConSwf", hacerAlgo);

function hacerAlgo(e:Event):void
{
   //Aquí colocas el código para modificar el swf cargador
}


Al evento que distribuyo lo llamo "comunicarConSwf", pero puedes llamarlo como quieras; eso sí, debe llamarse igual en ambos swf's

De esta forma, evitas que el swf cargado MODIFIQUE directamente al swf cargador. Si en el swf cargador no se añade el listener no va a pasar nada. Piensa en tí dentro de un par de años cuando recuperes este proyecto ;)

Un saludo.

Por Lukánicos

Claber

468 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 10 Oct 2012 04:11 pm
muchisimas gracias por responder, me has enseñado mucho.. eso incluye el no usar ese método O_O *tiembla bajo las amenazas*
hehe..

aun así.. creo que termine mas confundido, supongo por que desconocía esa manera de hacerlo.
leeré un poco mas del tema..
aun no entiendo como es que se pasa la variable loader a través de los distintos swf u.u

Por desfaz

10 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 10 Oct 2012 04:50 pm
BuenAS:

En el swf cargador, imagino, habras creado un Loader. Imagino tambien que habras añadido un listener para el Event.COMPLETE. (realmente puedes acceder a AS del archivo cargado con el evento INIT, pero bueno, no liemos más).

Pues bien, cuando se haya producido el Event.COMPLETE, en la propiedad 'content' del loader TIENES el swf que has cargado. Y cuando digo TIENES, es a todos los efectos: puedes acceder a todos sus métodos / propiedades públicos, y éste puede acceder, como otro Sprite / MovieClip más de tu swf cargador, a todo.

Si quieres 'verlo', crea un punto de interrupción dentro de la función listener. O sea, pulsa en Flash Prof. con el ratón en el principio de la línea de código. Verás aparecer un pto. rojo. Ahora publica pulsando CTRL + ALT + Intro, en lugar de CTRL + Intro.

Cuando se produzca el evento Event.COMPLETE del swf cargado se llegará a este pto de ruptura y te aparecerá un panel de depuración, ve a la pestaña de variables y verás que dentro de la propiedad content de tu loader está el swf que has cargado (verás todo lo público que tenga)

Un saludo.

Por Lukánicos

Claber

468 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 10 Oct 2012 04:53 pm
...quería decir: publica pulsando CTRL + Mayúsculas. + Intro O:)

Por Lukánicos

Claber

468 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 10 Oct 2012 05:33 pm
que bien imaginas o_ o
bueno..vale.. ahm.. fuu <_> creo que debo almorzar antes de seguir con esto sino me volveré loco T^T
veamos..
mi archivo 01.swf es un.. menu.

Código ActionScript :

var loa:Loader = new Loader();
boton.addEventListener(MouseEvent.CLICK, inicio);
function inicio(event:MouseEvent):void
{
   gotoAndPlay(451);//animaciones sexys (?)
   loa.load(new URLRequest("02.swf"));//cargo el loader
   addChild(loa); //agrego el loader
}


con eso ya veo mi 02.swf todo lindo y sexy. En el hay varios botones, uno de ellos debería servir como un "atras" lo que quiero que haga es que modifique el contenido de loa, pero.. u.u

Código ActionScript :

boton2.addEventListener(MouseEvent.CLICK, go);
function go(event:MouseEvent):void
{
   gotoAndStop(172); //va a ese fotograma por que hay una animación y eso ^^'
}
/*una vez llega al fotograma quiero que pueda modificar a loa con algo asi*/
        loa.load(new URLRequest("03.swf"));


La intención de eso ultimo es recargar loa, eliminando el botón que se presiono y todo lo que (tiene el loader) se ve, para cargar el 03.swf

intente lo que me dijiste, (muchas gracias) pero.. aun no lo logro, aun no entiendo el dispatchEvent u-u
leí que sirve para ejecutar eventos fuera de su origen, ejemplo, ejecutar un evento de click aun cuando no se haga click, pero en mi casa, no están en el mismo swf (01.swf), esta en otro, usar 'loa' en el 02.swf me da error u_u.

Seguiré leyendo acerca del dispatchEvent u_u

Por desfaz

10 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 11 Oct 2012 09:31 am
BuenAS:

Lo primero, crea un Evento personalizado para poder pasar datos. Cea un archivo de texto llamado CustomEvent .as y copialo en la carpeta donde tengas el .fla:

Código ActionScript :

package
{
   import flash.events.Event;
   
   public class CustomEvent extends Event
   {
      public static const SEND_MESSAGE_CHANGED:String = "sendMessageChanged";
      
      public var message:String;
      
      public function CustomEvent(type:String, message:String = "", bubbles:Boolean = false, cancelable:Boolean = false)
      {
         super(type, bubbles, cancelable);
         this.message = message;
      }
      
      override public function clone():Event
      {
         return new CustomEvent(type, message, bubbles, cancelable);
      }
      
      override public function toString():String
      {
         return formatToString("CustomEvent", "type", "message", "bubbles", "cancelable", "eventPhase");
      }
   }
}



En el swf que cargas:

Código ActionScript :

boton2.addEventListener(MouseEvent.CLICK, go);
function go(event:MouseEvent):void
{
   //gotoAndStop(172); //va a ese fotograma por que hay una animación y eso '
   dispatchEvent(new CustomEvent(CustomEvent.SEND_MESSAGE_CHANGED, "ir a fotograma 172", true));
   //podrías pasar el texto "cargar nuevo swf" para cargar un nuevo swf
}



y en el swf que carga al anterior:

Código ActionScript :

addEventListener(CustomEvent.SEND_MESSAGE_CHANGED, onSendMessage);

function onSendMessage(event:CustomEvent):void
      {
         switch(event.message)
         {
            case "ir a fotograma 172":
               //aquí colocarías el código para ir al fotograma 172
               break;
            case "cargar nuevo swf":
               //aquí colocarías el código para cargar el siguiente swf
               break;
         }
      }


Más que hacer copy&paste, seria mejor intentar comprender la idea ;)

Un saludo.

Por Lukánicos

Claber

468 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 11 Oct 2012 04:11 pm
tienes razon, no debiste poner el codigo (?)
je bueno gracias, igual intentare hacer sin ver el codigo >:3
queria evitar trabajar con clases apartes, pero bueno.
eventos personalizados..u.hm..uhm...

Gracias por la ayuda ^^ se te devolverá..en...uhm..brownies .-.

Por desfaz

10 de clabLevel



Genero:Masculino  

firefox

 

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