Comunidad de diseño web y desarrollo en internet online

gotoAndPlay, nextFrame... detiene clip

Citar            
MensajeEscrito el 16 Sep 2009 03:46 pm
Soy bastante novato en flash y as3 y me estoy encontrando con este problema. Si uso gotoAndPlay, gotoAndStop, nextFrame, prevFrame en un moviclip que realiza una animacion motion tween a un movieclip hijo, la animación interna de ese movieclip hijo se detiene.

Voy a intentar explicarme un poco mejor. Tengo un moviclip vacio en la biblioteca. Ese clip lo introduzco en el primer frame de otro moviclip contenedor. En la linea de tiempo de ese clip contenedor realizo un motion tween de x frame de duración que simplemente mueve el clip vacio de un lado a otro de la escena. A ese movieclip vacio le añado con as3 un hijo (un swf externo).

Con esto sin más todo funciona bien. El clip que inicialmente está vacio se mueve de un sitio (motion tween de la línea de tiempo del clip contenedor) a otro mientras al mismo tiempo el clip que se le carga dentro se reproduce en bucle.

Si el movieclip contenedor lo paro en el primer frame con un stop la animación interna también funciona perfectamente en bucle.

Con play y stop da la impresión que el clip hijo se reproduce perfectamente.

El problema me aparece cuando quiero controlar la animación, el motion tween del clip contenedor. Necesito controlar ese tween porque quiero poder realizar el tween hacia adelante, hacia atrás, y a diferentes velocidades. Lo que hago por tanto es parar el clip contenedor al principio y controlar su movimiento con un evento ENTER_FRAME en el que calculo el siguiente frame a visualizar y con un gotoAndStop situo la cabeza lectora de manera adecuada (tambien he hecho pruebas con gotoAndPlay, nexFrame, prevFrame).

Pues haciéndolo así el motion tween funciona perfectamente y se mueve con la lógica que yo programo, pero el clip interno queda parado. Si en algún momento realizo un stop del clip contenedor, el clip interno se pone otra vez en marcha.

¿Hay alguna manera de solucionar eso? Necesito que el clip interno se reproduzca en bucle sin importar la lógica de movimiento del clip contenedor.

Por porba

12 de clabLevel



 

firefox
Citar            
MensajeEscrito el 16 Sep 2009 05:33 pm
Si la animación interna se detiene puede que no estés obreescribiendo el onEnterFrame o que si el tween se basa en la línea de tiempo, no tengas a tu clip interno en todos los fotogramas del padre.

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 16 Sep 2009 06:22 pm
El clip interno que debe reproducirse en bucle es un clip externo cargado. O sea lo que tengo es:

Clip que realiza la animación de un clip vacío, esta animación está basada en un motion tween realizado en diseño (basado en línea de tiempo).
Al clip vacío le añado mediante actionscript un hijo, un loader con la animación flash cargada (esta animación va a ser externa y me interesa que se pueda cargar cualquier animación de la duración que sea).

Si dejo las animaciones tal cual sin controlar nada el movimiento todo funciona bien. El clip más externo se ejecuta en bucle y dentro de el se ejecuta también el interno en bucle. El interno dura menos (será más o menos la mitad de duración) o sea que por cada vez que se reproduce el tween de principio a fin el interno realiza dos bucles. O sea que todo está funcionando como desearía.

El problema llega cuando trato de controlar el tween del clip más externo con actionscript en vez de dejar que se ejecute en el bucle normal. Para ello es para lo que utilizo el evento enterframe, calculo el fotograma del tween en el que quiero situar la cabeza lectora de ese clip y la muevo allí. Pero en cuanto hago eso el clip interno deja de funcionar.

Lo de sobreescribir el enterframe no lo entendí, ¿lo hereda el clip interno?

Voy a poner un ejemplo de un caso que requeriría lo que yo quiero, quizá alguien me pueda orientar de otra manera de como hacerlo.

Imaginemos que quiero una caja que se mueva de arriba a abajo de la pantalla y dentro quiero que se le pueda cargar una animación flash (swf) sea la que sea y que esa animación cargada se reproduzca en bucle sin depender para nada de la línea de tiempo del clip que lo contiene. El movimiento de la caja lo quiero controlar de manera que en cualquier momento pueda hacerlo mover hacia arriba o hacia abajo y a distintas velocidades (lo que me obliga a controlar el tween desde as3).

Por porba

12 de clabLevel



 

firefox
Citar            
MensajeEscrito el 16 Sep 2009 06:37 pm
Síntesis:

- Contenedor con tween en línea de tiempo
- Clip interno carga animación externa (Loader.load(new URLRequest("xxx.swf"))) en AS3
- addChild(loader) para incorporarlo a la línea de tiempo del principal

Si este es el caso y deja de andar cuando mueves por AS el cabezal del contenedor, no veo porqué debería detenerse, si no es el caso corrige (con la mayor síntesis de que seas capaz)

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 16 Sep 2009 06:52 pm
Sí, eso hago exactamente y cuando intento mover el cabezal de la línea de tiempo del tween se para la animación interna cargada. Iba a poner el código.

Además que lo compruebo porque dejo que los primeros 20 frames del tween los haga sin que haga nada el enterframe y en esos primeros 20 frames el clip interno funciona correctamente, pero a partir del 20 lo intento mover yo, ahora mismo para simpliciar con prevFrame y nextFrame y se queda parado el clip cargado. El tween funciona con la lógica que le pongo a partir de ese frame 20 pero la animación interna se para y solo vuelve a funcionar cuando ya no se llama a prevFrame o nextFrame (o lo mismo pasaría con gotoAndStop y gotoAndPlay).

Por porba

12 de clabLevel



 

firefox
Citar            
MensajeEscrito el 16 Sep 2009 06:55 pm
Pon el code con que estás animando

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 16 Sep 2009 07:00 pm
El Documento principal, simplemente hace una precarga del clip externo y añade el clip con el tween al escenario:

Código ActionScript :

package {
  import flash.display.MovieClip;
  import flash.display.Loader;
  import flash.net.URLRequest;
  import flash.events.Event;
   
  public class MyDocument extends MovieClip {
      
    private var myLoader:Loader;
      
    public function MyDocument () {
      preload();
    }
      
    private function preload() : void {
      myLoader = new Loader();
      myLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, startMovie);
      myLoader.load(new URLRequest("manfer.swf"));
    }
      
    private function startMovie(e:Event) : void {
      var myMovie:MovieClip = new Movie1(myLoader);
      addChild(myMovie);
    }

  }
}


Move1 es un movieclip de la librería que en línea de tiempo tiene un tween (60 frames) que mueve un clip vacío de arriba a abajo y tiene el siguiente código de clase enlazado:

Código ActionScript :

package {
  import flash.display.MovieClip;
  import flash.events.Event;
  import flash.display.Loader;
   
  public class Movie1 extends MovieClip {
      
    private var moveBackwards:Boolean;
    private var myLoader:Loader;

    public function Movie1 (myLoader:Loader) {
      this.myLoader = myLoader;
      moveBackwards = false;
         
      clipVacio.addChild(myLoader);

      addEventListener(Event.ENTER_FRAME, doMove);
    }
      
    private function doMove (e:Event) : void {
     // Esto es superfluo ahora mismo, nunca se llega
     // Simplemente porque varie el código para que
     // durante los 20 primeros fotogramas la animación
     // se mueva con el play inicial y comprobar que así
     // sí se anima el clip interno
      if (currentFrame == 2 && moveBackwards) {
        moveBackwards = false;
        removeEventListener(Event.ENTER_FRAME, doMove);
        stop();
        return;
      }
      if (currentFrame == 59) {
        moveBackwards = true;
      }

      if (currentFrame > 20) {
        if (moveBackwards) {
          prevFrame();
        } else {
          nextFrame();
        }
      }
    }
  }
}

Por porba

12 de clabLevel



 

firefox
Citar            
MensajeEscrito el 16 Sep 2009 07:10 pm
El código de doMove va a ser algo más próximo a esto:

Código ActionScript :

    private function doMove (e:Event) : void {
      if (currentFrame == 1) {
        stop();
      }
     
      if (currentFrame == 2 && moveBackwards) {
        moveBackwards = false;
        removeEventListener(Event.ENTER_FRAME, doMove);
        return;
      }

      if (currentFrame == 59) {
        moveBackwards = true;
      }

      if (moveBackwards) {
        gotoAndStop(currentFrame - 1);
      } else {
        gotoAndStop(currentFrame + 1);
      }
    }



Pero haciendo eso el clip cargado ya no muestra su animación para nada (se queda estático en su primer fotograma).

Por porba

12 de clabLevel



 

firefox
Citar            
MensajeEscrito el 16 Sep 2009 07:13 pm
Perdón falta un pequeño matiz en la última frase anterior.

Con ese doMove el clip cargado no muestra su animación. Hasta que finaliza el movimiento en retroceso del tween y en el frame 2 con movimiento hacia atrás se elimina el evento enterframe. Entonces se para el tween que es lo que estoy haciendo en el código y empieza el clip cargado su animación en bucle.

Por porba

12 de clabLevel



 

firefox
Citar            
MensajeEscrito el 17 Sep 2009 12:16 pm
Me acabo de fijar en el título de la consulta y no tiene mucho sentido tal como se ve, juraría que puse que estaba relacionado con que detenía a los hijos. Quizá se cortó el título por ser largo y falta la palabra hijos al final.

Bueno, el caso es que tras darle unas cuantas vueltas parece que no queda más remedio que controlar también el movimiento del clip interno o sino se para al mover programáticamente la cabeza lectora del frame padre. Solo en los frames en que el padre se mueve normalmente (play) el hijo también funciona correctamente. Esto también lo he comprobado haciendo una función de control del padre que solo lo hiciera cada 3 frames (currentFrame % 3 == 1). En ese frame de cada tres muevo la cabeza lectora con gotoAndPlay y haciéndose así el hijo muestra su animación porque tiene 2 frames de cada tres para realizarla.

No voy a seguir más con ese rollo porque la razón exacta exacta de porque no se llama al movimiento del hijo en esos casos no la sé. Así que muestro que solución le veo, como digo al principio controlando también el movimiento en bucle del hijo. Así que el código modificado para Movie1, la clase del clipVacio donde se carga el clip externo, queda como sigue:

Código ActionScript :

package {
  import flash.display.MovieClip;
  import flash.events.Event;
  import flash.display.Loader;
   
  public class Movie1 extends MovieClip {
      
    private var moveBackwards:Boolean;
    private var myClip:MovieClip;

    public function Movie1 (myLoader:Loader) {
      this.myClip = MovieClip(myLoader.getChildAt(0));
      moveBackwards = false;
         
      clipVacio.addChild(myClip);
     
     myClip.addEventListener(Event.ENTER_FRAME, doBucle);

      addEventListener(Event.ENTER_FRAME, doMove);
    }

    private function doBucle(e:Event) : void {
      if (myClip.currentFrame == myClip.totalFrames) {
        myClip.gotoAndPlay(1);
      } else {
        myClip.nextFrame();
      }
    }
   
    private function doMove (e:Event) : void {
      if (currentFrame == 1) {
        stop();
      }
     
     if (currentFrame == 2 && moveBackwards) {
        moveBackwards = false;
        removeEventListener(Event.ENTER_FRAME, doMove);
        return;
      }
     if (currentFrame == 58) {
        moveBackwards = true;
      }

      if (moveBackwards) {
        gotoAndStop(currentFrame - 1);
      } else {
        gotoAndStop(currentFrame + 1);
      }
    }
  }
}


Con ese código ya puedo controlar sin problemas el motion tween del padre (puedo modificar la función doMove que lo controla a mi gusto) y el clip cargado externamente realizará su animación en bucle.

Por porba

12 de clabLevel



 

firefox

 

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