Comunidad de diseño web y desarrollo en internet online

MovieClips anidados. Acceso a su linea de tiempo

Citar            
MensajeEscrito el 13 Ene 2011 11:37 am
Hola de nuevo, sigo con mis problemas de acceso a la linea de tiempo y Mc's de un SWF externo. Algo he avanzado pero no consigo un control total del mismo. A ver si alguien me puede ayudar porque empiezo a desesperar :S

Trabajo con Flash Develop y hago la carga del SWF a través de un obj. Loader etc, pero eso no es un problema (la carga se realiza ok). Comento la estructura de mi SWF:

-Tengo una instancia (nombre instancia: animationSet) de un Mc de la biblioteca (nombre del componente: AnimationSet), dicho MovieClip tiene una linea de tiempo con 4 frames con un Mc anidado en cada frame:

Frame 1 (nombre del frame: animation_state01): Instancia (nombre instancia: animation_state01) de un Mc (Animation_state01)
Frame 2 (nombre del frame: animation_state02): Instancia (nombre instancia: animation_state02) de un Mc (Animation_state02)
Frame 3 (nombre del frame: animation_state03): Instancia (nombre instancia: animation_state03) de un Mc (Animation_state03)
Frame 4 (nombre del frame: animation_state04): Instancia (nombre instancia: animation_state04) de un Mc (Animation_state04)

-Cada Mc tipo (Animation_stateN) tiene una linea de tiempo de 3 frames.

En el acceso a el primer nivel (moverme por los frames animation_state01....animation_state04) no tengo ningún problema, e incluso a la linea de tiempo del Mc situado en el primer frame:

Código ActionScript :

      //FUNCTION: 
      //--------Método que se ejecuta cuando el archivo swf se ha descargado
      private function completeHandler(event:Event):void {
         
         trace("completeHandler: " + event);
         
         //Timeline control
         var animationHolder:MovieClip=new MovieClip(); 
         animationHolder = event.target.content;
         //Acceso a Mc (padre)
         var animationChilds:MovieClip = new MovieClip(); 
         animationChilds = MovieClip(animationHolder.getChildAt(0));
         trace("name: " + animationChilds.name); //output:animationSet
         animationChilds.gotoAndStop("animation_state01"); 

         //Acceso a Mc (hijos) anidados
         var animationState:MovieClip = new MovieClip(); 
         animationState = MovieClip(animationChilds.getChildAt(0)); 
         trace("name: " + animationState.name);//output: animation_state01 
         animationState.gotoAndStop(3); 
      }


El problema me viene cuando por ejemplo quiero acceder al Mc (animation_state02) que está en el segundo frame del clip padre. Bueno, en general a cualquiera que no esté en el primer frame...Solo detecta como hijo el contenido del primer frame.

He tratado de ser lo más clara posible aunque entiendo que es algo confuso sin ver el SWF y su contenido. Pero por favor, alguien me puede ayudar!!!! Lo necesito con urgencia y no hay manera :(

Mil Gracias de antemano!

Por emedmaria

73 de clabLevel



 

chrome
Citar            
MensajeEscrito el 13 Ene 2011 12:19 pm
Hasta que el cabezal de reproducción no se mueve a un frame, lo que existe en él no cuenta a nivel código. Adicionalmente si tem mueves con un gotoAndStop e inmediatamente quieres acceder al contenido no puedes por la forma en que Flash ejecuta el código (hay que esperar a que se ejecute la inicialización del frame al que te estas moviendo) Si tu caso entra en cualquiera de estas dos hipótesis, es así como flash funciona

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 13 Ene 2011 01:56 pm
Gracias Jorge!
Entiendo más o menos lo que dices pero no veo como hacerlo...Aunque me desplace un frame sigue sin ver mas Childs que los del frame anterior.
¿Como sé cuando puedo acceder al contenido del siguiente frame?

Por emedmaria

73 de clabLevel



 

chrome
Citar            
MensajeEscrito el 13 Ene 2011 02:34 pm
Prueba algo así para ver si es el motivo

Código ActionScript :

gotoAndstop(2)
var t:Timer = new Timer(100, 1)
t.addEventListener(TimerEvent.TIMER, accede)
function accede(evt:TimerEvent){
   //aquí accedes al contenido
}


La idea es demorar el acceso a los elementos del frame al que vas usando un timer ... es un poco engorroso, pero la estructura de AS3 no cuadra con usar línea de tiempo

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 13 Ene 2011 03:52 pm
Gracias Jorge!
Lo estoy mirando pero no acaba de ir...Estoy cambiando la jerarquía de los objetos del SWF, a ver que tal.

Otra consulta muy tonta, ¿cómo puedo reproducir un intervalo de la linea de tiempo que va de "nombre_frame_inicio" a "nombre_frame_fin"? Sin poner un stop en el keyframe final del timeline (no quiero tener nada de código en la linea de tiempo). Lo que he probado no funciona, entra en un bucle infinito :S

Código ActionScript :

private function playAnimation(_frameName:String, _loop:Boolean):void {
   var endLabel:String;
        var currentLabel:String; 
         
   var currentAnimation:MovieClip = new MovieClip(); 
   currentAnimation = MovieClip(animationHolder.getChildAt(0)); //instancia del clip que contiene toda la animación
                           
   currentLabel = _frameName; 
   endLabel = _frameName + "_end"; 
         
   //Animación sin loop

        while (currentLabel != endLabel)
   {
              currentAnimation.gotoAndStop(currentLabel); 
         currentAnimation.nextFrame(); 
         currentLabel = currentAnimation.currentFrameLabel;             
   }
      

Por emedmaria

73 de clabLevel



 

chrome
Citar            
MensajeEscrito el 14 Ene 2011 08:15 am
Emed, respecto a la segunda consulta, simplemente crea un listener ENTERFRAME del objeto y lo paras cuando quieras.
Empezamos con algo más sencillo. Hacer que un MC avance uno a uno el frame

Código ActionScript :

mc.addEventListener(Event.ENTER_FRAME,moverMC)
private function moverMC(e:Event){
    var mc:MovieClip=e.target as MovieClip
    if (mc.currentFrame<mc.totalFrames){
         mc.gotoAndStop(mc.currentFrame+1)
    }else{
        mc.gotoAndStop(1)
    }
}

Vale, tenemos que hacer que nuestro MC se mueva desde donde está hasta un Label final y haga bucle o no según queramos. Para ello precisamos tres variables, la "label incial", la "label final" y si queremos que haga un bucle

Código ActionScript :

//Las variables
mc._firstFrame=currentAnimation.currentLabel
mc._loop=_loop
mc._lastFrame=_frameName
//el Listener
mc.addEventListener(Event.ENTER_FRAME,moverMC)

//La función
private function moverMC(e:Event){
   var mc:MovieClip=e.target as MovieClip
   if (mc.currentLabel==mc._lastFrame){  //Si ha llegado a la última etiqueta
         if (mc._loop){  //si es un bucle
                mc.gotoAndStop(mc._firstFrame)
         }else{       //si no, eliminamos el ENTERFRAME
              mc.removeListerner(MouseEvent.ENTERFRAME,moverMC)
         }
   }else{
        if (mc.currentFrame<mc.totalFrames){
            mc.gotoAndStop(mc.currentFrame+1)
        }else{
            mc.gotoAndStop(1)
        }
   }
}


Vale, ya tenemos todos los elementos. en nuestra función playAnimation

Código ActionScript :

private function playAnimation(_frameName:String, _loop:Boolean):void { 
   var endLabel:String; 
   var currentLabel:String;  
          
   var currentAnimation:MovieClip=MovieClip(animationHolder.getChildAt(0)); //instancia del clip que contiene toda la animación 
   //Le vamos a dar a nuestro MC unas "variables"
   currentAnimation._firstFrame=currentAnimation.currentLabel
   currentAnimation._loop=_loop
   currentAnimation._lastFrame=_frameName
   //creamos el Listener
   currentAnimation.addEventListener(MouseEvent.ENTERFRAME,moverMC)
}

private function moverMC(e:Event){
     .....
}

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 14 Ene 2011 09:50 am
¡¡¡Mil gracias Eliseo!!

Una explicación muy clara :)

Por emedmaria

73 de clabLevel



 

chrome

 

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