Comunidad de diseño web y desarrollo en internet online

Pausar un SWF por completo elegantemente con Actionscript 3

Problema:
Necesito pausar momentáneamente la ejecución de un archivo SWF, como por ejemplo la Pausa en los videojuegos.

Solución:
Imaginemos que tengo un videojuego que deseo pausar en un momento determinado. Suponiendo que todo el código dependiera de un sólo enter frame (que se encargaría de llamar a la/s función/es de las distintas instancias) sería sólo cuestión de poner un if antes del resto de la función o de usar un puntero a función (que nos permitiría ejecutar sets distintos de acciones dependiendo de la situación, Mmmm, huelo otro quick tip).

Hasta aquí todo bien, pero ¿qué hacemos con las animaciones? Ahí se complica, podríamos optar por parar (con el método stop()) todos los MovieClips y "reanimarlos" con play() cuando queramos reanudar el juego, pero tendríamos que tener en cuenta que quizá no a todos debamos darles play(). Además si tenemos animaciones complejas con varios MovieClips anidados hacer esto es una absoluta pesadilla (se puede usar un método iterativo con un -pseudo código- for each child in this), pero eso sin siquiera considerar que ciertas animaciones deben detenerse en un momento determinado.

¿La solución más usada? Los programas no pausan las animaciones, limitándose a detener el update lógico. Cosa poco estética que al no-programador le da una especie de asquito y una sensación de producto no terminado.

Pero de repente, luego de lidiar por tanto tiempo con este problema encontré la solución perfecta. Es tan increíblemente simple que no puedo creer que a nadie se le haya ocurrido antes (lo que, lógicamente, me incluye a mí mismo) y mientras escribía la función en eclipse (con una sonrisa de oreja a oreja, babeando como chico de 12 años con una Playboy) no podía dejar de pensar:

HernanRivas completamente fuera de sí :

No puede funcionar, es demasiado simple, no te ilusiones, abandon all hope, ni lo pruebes, no lo hagas, te vas a desepcionar, pateá la computadora y olvidate del asunto, no lo hagas, nooooo......


La cosa es que, a pesar de todo, funcionó, motivo por el que grité "soy un genio" hasta quedar disfónico (aunque antes de hacer el ridículo, busqué en google para asegurarme que nadie había dado con eso antes).

La solución es ésta:

Código :

public function pause ():void
{
stage.framerate = 0;
}


public function resume ():void
{
stage.framerate = 30;
}


OMFG!!! ¿¡¿¡¿FUNCIONA?!?!?
Si, y los problemas que esto origina son sólo 2 y fáciles de solucionar :
  1. Flash refresca una vez por segundo cuando uso MOUSE_MOVE : Creo que actualiza cada un segundo (aprox) porque es en ese punto que el garbage collector hace su trabajo (mi teoría está fundamentada, pero no alcanza el paréntesis para explicarlo). En general eso no importa porque todo está detenido. Si lo que queremos es mover el cursor, simplemente agregamos un updateAfterEvent. Método que también existe para el timer event. En la ayuda de Flash está todo muy explicado.

  2. Pero no quiero detener TODO : Esto es un poco más complicado, lo que tenemos que hacer es usar eventos que no dependan del framerate como el teclado, el mouse o el timer. Éste último nos permite que ciertos MovieClips continúen animados. Si quieren implementar ésto utilicen el tip para animar MovieClips a distintos framerates.


NOTA : Tengan en cuenta que si la función "pause" tiene más líneas de código, deberían ubicar la que setea el framerate al final. Para asegurarse un último refresh.

Por cierto, pueden ver la prueba de que prácticamente a nadie se le ocurrió (publicar) esta idea (6 resultados relevantes para google). Y no encontré ninguna mención a la pausa.

¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.

Publica tu comentario

o puedes...

¿Estás registrado en Cristalab y quieres
publicar tu URL y avatar?

¿No estás registrado aún pero quieres hacerlo antes de publicar tu comentario?

Registrate