Flash CS3 timeline: problema accediendo a contenidos de un frame.
Acabo de solucionar un problema con texto dinámico que me ha dado más de un dÃa de quebraderos de cabeza en el trabajo.
El caso
Resulta que los contenidos de un frame en concreto (que no sea el 1) de la lÃnea de tiempo (me refiero a cualquier instancia colocada en el escenario), NO están disponibles, o mejor dicho, NO existen nada más llegar al frame.
Por ejemplo:
- Crea una peli nueva
- Pon un movieClip en el frame 5 con nombre de instancia “prueba”
- Ahora vuelve al frame 1 y en panel de acciones escribe este código:
stop(); gotoAndStop(5); trace(prueba); // null
El resultado del trace nos da “null” !!!!!
Esto no pasaba en as2, y me fastidia que en algunos aspectos as3 va hacia atrás en lugar de mejorar las cosas (y eso que no puedo vivir sin él).
Solución
Para solucionar esto hay que programar un método que busque periódicamente el movieClip “prueba” hasta que ya esté disponible. ¿Cómo?, pues con un Timer por ejemplo:
stop(); gotoAndStop(5); trace(prueba); // null var timer:Timer = new Timer(10, 0); // se repite cada 10 milisegundos indefinidamente timer.addEventListener(TimerEvent.TIMER, AccessContent); timer.start(); function AccessContent(event:TimerEvent):void { if(prueba != null) { Timer(event.target).stop(); trace("ya tenemos acceso a prueba: ", prueba) } }
Yo personalmente preferirÃa no tener que hacer esto nunca, ya que me parece una guarrerÃa, pero a veces, por como está montado el proyecto, (o cómo nos lo han dado), o vete a saber qué cosas, pues tenemos que hacer ñapas como estas.
De todas formas, no se si esto es “lógico” o es un bug.
Saludos
June 3rd, 2008 at 5:03 pm
Buenas Diego! TenÃa un comment pendiente para esta entrada :)
El funcionamiento que describes es normal, y también pasaba en todas las versiones anteriores de Flash/ActionScript. Quizá comentas que en AS2 no ocurrÃa porque el compilador se lo “traga” todo y no arroja error, pero realmente un objeto no se define hasta que se alcanza.
Imagina que al alcanzar el frame1 se instancian todos los elementos de la linea de tiempo. A su vez, por el hecho de instanciar un movieclip, se instancia toda su linea de tiempo también, y asà sucesivamente. Es decir, que aunque no nos movamos del frame1 tenemos cargada en memoria toooda la pelÃcula. ¿No serÃa muy óptimo, no?
Y en cuanto al Timer no es lo mejor porque se consumen recursos innecesariamente. Yo optarÃa por definir una función en el primer frame, y al alcanzar el quinto frame llamarla, avisando asà que ya se puede acceder al contenido. Y si se quiere hacer un poco más elegante, y para que trabaje con clases, etc. se podrÃa dispatchar un evento:
Frame 1:
———
stop();
gotoAndStop(5);
this.addEventListener(”object_added”, objectAdded);
function objectAdded(e:Event):void {
trace(prueba);
}
Frame 5:
———
stop();
this.dispatchEvent(new Event(”object_added”));
Un saludo!!
pd: sorry por el tostón, me ha quedado algo largo :P
June 3rd, 2008 at 8:15 pm
Buenas:
Está claro que un timer consume mas recursos, en realidad lo hice para esparcir el código por la lÃnea de tiempo.
Otra opción serÃa la función que tú comentabas para añadir un script a un frame en concreto del timeline (¿era “addFrameScript” ?), que en alguna ocasión me ha venido bién.
Pero sÃ, en resumidas cuentas tu código es más limpio.
Y si no recuerdo mal, creo que hice la prueba con as2 y el trace salia bien, reconociendo el objeto después del gotoAndStop
Un saludo