Pregunta

He creado una animación flash (CS5, ActionScript 3) y la convertí a SWF. La animación Flash necesita los valores de 3 variables (definidas en la línea de tiempo SWF) antes de que comience a ejecutarse en mi aplicación Flex. He incrustado el archivo SWF usando SWFLoader en Flex, pero necesito pasar los parámetros de Flex en Flash antes de que comience la animación. ¿Cómo hago esto?

La forma en que tengo mi configuración de código flexible a continuación, las variables no se están actualizando. Obtengo una excepción cada vez que llega a la función ChangeParams porque no puede encontrar "tipo", "num1", etc.

Parte de mi código de flash:

//These 3 variables need to be populated via Flex BEFORE the animation starts...
var Num2:int;
var Num1:int;
var Type:String;

var whichNumber:int;
var frameNumber:int;

function playMe():void {
switch (Type) {
    case 'type1':
        gotoAndPlay(16);
        break;
    case 'type2':
        frameNumber = 27;
        whichNumber = 1;
        gotoAndPlay(frameNumber);
        break;
    case 'type3':
        frameNumber = 29;
        whichNumber = 1;
        gotoAndPlay(17);
        break;
    case 'type4':
        whichNumber = 1;
        break;
}
}

Mi código flexible:

        public function changeParams():void {
            idAnimation.content["Type"] = 'type1';
            idAnimation.content["Num1"] = 6;
            idAnimation.content["Num2"] = 30;
            trace ("Type= " + idAnimation.content["Type"]);
            trace ("Num1= " + idAnimation.content["Num1"]);
            trace ("Num2= " + idAnimation.content["Num2"]);
        }
    ]]>
</mx:Script>

<mx:SWFLoader id="idAnimation" source="animation.swf" init="changeParams()" />
¿Fue útil?

Solución 2

Bien, descubrí lo que estaba mal. Como sugirió Anemgyenge, cambié mi función para ejecutar en "Complete" en lugar de "init", pero ChangeParams () nunca corrió hasta que dejé de tratar de incrustar el SWF al SWFLoader. Supongo que no incluí así como lo estaba haciendo en mi original después de mi error. Si intenta incrustar con @embed, no ejecuta el evento "completo" cuando espera que lo haga.

La otra cosa que hice fue agregar un "gotoandplay (1)" para que jugara el primer cuadro después de que se establecieran los parámetros. Como sugirió Anemgyenge, agregué Stop () al comienzo de mi código de flash para que no se repita hasta que Flex lo indique. Utilizo establecedores de enlace para ejecutar ChangeParams () cada vez que una de mis variables de los cambios flexibles para que los parámetros se actualizarán en el flash SWF e iniciarán la película en el cuadro 1. ¡Muy contento de finalmente tener esto resuelto! :)

Aquí está mi código flexible actualizado:

public function changeParams():void {
      if (idAnimation.content != null) {
        idAnimation.content["Type"] = myString;
        idAnimation.content["Num1"] = myNum1;
        idAnimation.content["Num2"] = myNum2;
        MovieClip(idAnimation.content).gotoAndPlay(1);
        trace ("Type= " + idAnimation.content["Type"]);
        trace ("Num1= " + idAnimation.content["Num1"]);
        trace ("Num2= " + idAnimation.content["Num2"]);
      }
    }
]]>
</mx:Script>

<mx:SWFLoader id="idAnimation" source="assets/animation.swf" complete="changeParams()" />

Otros consejos

Si idAnimation es el nombre de la instancia del Movieclip lo que estaba incrustado al principio, entonces también puede ser un buen método, que crea una función en su SWF:

function setParamsAndAutoplay(value1:*, value2:*, vlaue3:*):void
{
     Num2 = value1;
     Num1 = value2;
     Type = value3;

     playMe();
}

De esta manera, seguro que establece los parámetros y comenzó la animación al mismo tiempo. También puedes poner stop(); Frente a cada código en el SWF para detener la obra.

Entonces agregaría esto a su código, antes de su playMe() función:

stop();

function setParamsAndAutoplay(value1:*, value2:*, vlaue3:*):void
{
     Num2 = value1;
     Num1 = value2;
     Type = value3;

     playMe();
}

¿Esto resolvería el problema?

EDITAR

También puedes intentar cambiar init="changeParams()" a complete="changeParams();".

Edición 2

O intente esto para cargar el SWF en su flexión. Esto no lo incrustará, si su intención era eso, pero puede verificar si la función funciona bien. Y tal vez esto pueda resolver el problema.

var ldr:Loader = new Loader();
ldr.contentLoaderInfo.addEventListener("complete", ldrDone);
ldr.load(new URLRequest("your-swf-file"));

function ldrDone(evt:*):void
{
    var movie:MovieClip = MovieClip(evt.target.content);
    movie.setParams(0, 1, 2);
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top