Tu propio youTube sin pagar ni un duro Web services + as3 API
Apr 18

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

2 Responses to “Flash CS3 timeline: problema accediendo a contenidos de un frame.”

  1. llops Says:

    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

  2. xleon Says:

    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

Leave a Reply