Actionscript 3, botones y eval()

martes, 15 de abril de 2008
Publicado por Ivan

En el nuevo Flash cs3 se introdujo (si no estoy mal) el nuevo actionscript 3. Una evidente prueba de que ahora adobe estaba metiendo las manos en el código de macromedia para ajustar las cosas a su medida. Como en general las cosas tienden a mejorar y no al revés, empecé a desarrollar un proyecto directo en actionscript 3, y me he encontrado de inmediato con 2 sorpresas.

La primera es que estaba generando un botón, y cuando me fuí al panel de acciones, no permitía agregar acciones. Luego de un reinicio del programa y del equipo, me di cuenta que a lo mejor había algo más. Buscando en las inmensidades de san Google, éste me reveló que actionscript ya no soporta la inclusión de codigo en simbolos de tipo botón. Ahora todo se va a manejar con listener. Esto significa que ahora el código va solo a nivel de fotogramas y clips de películas, por lo que hay que referenciar al boton por su nombre de instancia, y crear un listener que ejecute una función cuando se detecte un click sobre el objeto deseado. En particular, este fué el código que tuve que usar para mi botón:

function click_stand(evento:MouseEvent):void
{
    var stand:Object=evento.target.parent;

..........
}

feria.addEventListener(MouseEvent.MOUSE_DOWN, click_stand);

Es decir, cuando dentro del clip llamado feria, que es donde está mi botón, se produce un evento de ratón que implica que se hizo un click, se llamará a la función click_stand, donde se pasa como parámetro el evento que se produjo, y dónde se produjo. La línea que le sigue la explico más adelante.

Ok!!!!, pense, problema solucionado. Ahora, cómo necesito manejar varios objetos numerados en forma consecutiva, usaré el viejo eval() para ahorrarme el tener que repetir el mismo código 500.000 veces cambiando el número en cada uno de ellos. Y sorpresa!!, eval() también desapareció por completo de actionscript 3. Qué hacer??, bueno, en este caso se utiliza una alternativa que antes ya existía, pero solo de flash mx (si no me equivoco) empezó a utilizarse como tal, y no solo como operador para acceder a los elementos de un arreglo, que son los [].

Es decir, ahora en vez de usar eval(variable), se debe usar this[variable]. Genial!!, a nivel local a los objetos funciona impeque, pero en mi caso el código estaba en otro ámbito, por lo que ahí empecé a tener problemas. No encontré nada, por lo que tuve que empezar a picar, y usar el viejo prueba y error. Finalmente pude llegar a la respuesta que está a continuación

function click_stand(evento:MouseEvent):void
{
    var stand:Object=evento.target.parent;

    switch(stand.currentLabel){
        case 'disponible':     stand.gotoAndStop('reservando');
                            break;
        case 'reservando':     stand.gotoAndStop('disponible');
                            break;
        case 'reservado':     stand.gotoAndStop('disponible');
                            break;
    }
}

feria.addEventListener(MouseEvent.MOUSE_DOWN, click_stand);

En este caso, evento:MouseEvent almacena la referencia al objeto que llamó a la función, o en este caso, el objeto al cuál se le hizo click. Luego usando target se puede accesar al objeto que está en el nivel más bajo dentro de los cuáles se hizo click. Es decir, si tienes un boton dentro de una película dentro de otra película, target devolverá la referencia a ese boton. Pero como a mi me interesaba la película que estaba antes de ese botón, entonces agregué el parent. Luego dentro del switch usé stand,currentLabel, siendo esta propiedad el nombre con el cuál fué etiquetado el fotograma en que se encuentra actualmente el objeto referido por la variable stand, que es un clip de película como mencioné antes.

Eso!!, espero que les sirva de ayuda a aquellos que tengan alguna duda. Cualquier consulta o aporte, aquí estamos.

0 comentarios: