2010-01-20 5 views
6

Quiero que mi clip de película se reproduzca una vez y me detenga en el último fotograma. Uso el siguiente código en el ciclo de mi clase movieclip. (esto es as3)deteniéndose en el último fotograma (flash)

if(currentFrame == 120) 
stop(); 

120 es el último cuadro. Juega una vez. pero el problema es que vuelve al cuadro 1 otra vez. ¿Hay algún método mejor para detener un clip de película en un cuadro en particular?

+1

¿Acabas de encontrar una respuesta correcta? Si es así, márquelo como correcto –

Respuesta

1

fue porque el objeto se llamaba dos veces.

3

En la línea de tiempo, puede colocar un fotograma clave al final y agregar allí el método stop();. Cuando llegue a ese marco, se ejecutará el método stop();, y el clip se detendrá.

Suponiendo que está utilizando la línea de tiempo, pero suena como usted.

+0

estoy usando una clase personalizada adjunta al movieclip. Me gustaría hacerlo desde allí, pero si no puedo, supongo que tendré que conformarme con su solución. – numerical25

+0

Lo intenté y no funcionó. todavía comenzó desde el cuadro 1 de nuevo. rastreé el cuadro actual. muestra que se remonta a 1 – numerical25

+0

Bueno, esto significa que está sucediendo algo más. ¿Estás trabajando con MovieClips anidados para crear la animación? ¿Están siendo detenidos correctamente? Quizás si puedes compartir más sobre cómo tienes las cosas configuradas, podemos ayudarte a rastrearlo. –

0

Esto parece más a lo largo de las líneas de lo que busca:

addEventListener(Event.ENTER_FRAME, function(e:Event){ 
    if(currentFrame == totalFrames){ 
     stop(); 
     removeEventListener(event.type, arguments.callee); 
    } 
}); 

he añadido un detector de eventos (para ActionScript 3) así sucesivamente cada cuadro esta función se disparará y comprobar lo que está en enmarcar . Si es el último cuadro, se detendrá. Según su ejemplo, supongo que tiene una clase que amplía MovieClip.

+1

Esto funcionaría, pero es una solución bastante pobre en términos de rendimiento. Este enterframe continuará disparando después, sin forma de limpiarlo. Una mejor solución dinámica similar a esto sería usar el método addFrameScript. Por supuesto, si tuviera una referencia a la función, podría limpiarla, y estaría bien. –

+0

Estoy de acuerdo con Tyler. Las funciones anónimas también son malas, ya que permanecen en la memoria mucho más tiempo antes de que se las dividan. – alecmce

+0

Así que supongo que la función stop() en el timeLine es el camino a seguir. De hecho, estoy usando un solo bucle para todos mis clips de película, así que preferiría que no estuviera en un detector de eventos. gracias por las respuestas chicos – numerical25

0

juego de ingenio, sé que el problema no tiene nada que ver con que el flash no responde a mi función de detención(). Creo que puede tener algo que ver con flash llamando al clip de película dos veces. Uno encima de otro. Hacer que parezca que comenzó de nuevo. No estoy seguro. Si llamo al movieclip en otro lugar, funciona. simplemente no en mi ciclo. Hice un rastro y el rastro solo apareció una vez que muestra que lo inició una vez.

12

Si desea hacerlo con actionscript y no agrega un stop() al último cuadro en la línea de tiempo manualmente, entonces puede usar el método addFrameScript() no documentado.

mc.addFrameScript(mc.totalFrames - 1, function():void 
{ 
    mc.stop(); 
}); 

no pueden recordar el ámbito de la función, pero se puede utilizar ya sea mc.stop(), o simplemente dejar de().

* EDITAR - Agregado -1 al primer parámetro de addFrameScript, porque es basada en cero (por lo que poner un frameScript en marco que pondría).

+0

¡Eres un salvavidas! Ni siquiera pensé en agregar paradas a la línea de tiempo y simplemente llamar a 'play()' cuando lo necesito. –

0

Me di cuenta. Honestamente, creo que mi aplicación es defectuosa. Funcionó milagrosamente y yo no hice nada. En mi ciclo, hice if (actualframe == totalframes) y lo que no pasó antes ahora está sucediendo perfectamente. No sé por qué. Pero como dije, puede ser un problema de software porque a veces tengo problemas para transmitir valores a través de contructors. Y tiene que crear métodos especiales para aceptar esos valores.

3

La manera más fácil:

  1. Basta con seleccionar el último fotograma de la línea de tiempo. Abra el panel Acciones (F8). Asegúrese de que el cuadro u seleccionado aún esté seleccionado, de lo contrario, vuelva a seleccionarlo mientras el panel Acciones esté abierto.
  2. Después de seleccionar, simplemente agregue la función de detención simple() en el panel 'Marco de acción'.

    //add the following line to the actions pane of the last frame. 
    stop(); 
    
  3. Ya ha terminado. Opcionalmente puede agregar un botón de reproducción si es necesario.

+0

si no se establece con su clase personalizada – Sagar

+1

No sé qué herramienta usa, pero parece que utilizó Adobe Flash. si usa Adobe Flash CS6, abrir el panel Acciones (F8) es incorrecto. Abrir El panel de acciones es (F9). – kongkea

Cuestiones relacionadas