Могу ли я передать параметры в Flex 3 переменным в SWF-файл, используя swfloader? - PullRequest
0 голосов
/ 28 апреля 2011

Я создал Flash Animation (CS5, ActionScript 3) и преобразовал его в SWF.Флэш-анимации нужны значения 3 переменных (определенных на временной шкале swf) ДО того, как она запустится в моем приложении Flex.Я встроил SWF-файл с помощью swfloader во Flex, но мне нужно передать параметры из Flex во Flash до запуска анимации.Как мне это сделать?

При настройке моего гибкого кода ниже переменные не обновляются.Я получаю исключение каждый раз, когда он попадает в функцию changeParams, потому что не может найти «Type», «Num1» и т. Д.

Часть моего флэш-кода:

//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;
}
}

Myгибкий код:

        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()" />

Ответы [ 2 ]

2 голосов
/ 28 апреля 2011

Если idAnimation - это имя экземпляра мувиклипа, которое было внедрено в начале, то это также может быть хорошим методом, когда вы создаете функцию в своем SWF:

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

     playMe();
}

Таким образом, вы точно установите параметры и запустите анимацию одновременно. Вы также можете поставить stop(); перед каждым кодом в SWF для остановки воспроизведения.

Таким образом, вы добавили бы это в свой код, прежде чем ваша playMe() функция:

stop();

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

     playMe();
}

Это решит проблему?

EDIT

Также вы можете попробовать изменить init="changeParams()" на complete="changeParams();".

РЕДАКТИРОВАТЬ 2

Или попробуйте это загрузить SWF в ваш flex. Это не будет встроено, если вы этого хотели, но вы можете проверить, работает ли функция нормально. И, возможно, это решит проблему.

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);
}
0 голосов
/ 27 июля 2011

Хорошо, я выяснил, что случилось.Как предположил anemgyenge, я изменил свою функцию так, чтобы она выполнялась на «complete» вместо «init», но changeParams () никогда не запускалась, пока я не прекратил попытки вставлять swf в swfloader.Я предполагаю, что я не включил это, как я делал это в моем оригинальном посте - моя ошибка.Если вы попытаетесь встроить @embed, он не запустит событие «complete», когда вы этого ожидаете.

Другая вещь, которую я сделал, это добавила «gotoAndPlay (1)», чтобы он воспроизводил первый кадр после установки параметров.Как предположил anemgyenge, я добавил stop () в начало своего кода Flash, чтобы он не воспроизводился, пока Flex не скажет об этом.Я использую установщики привязок для запуска changeParams () в любое время, когда одна из моих переменных из Flex изменяется, поэтому параметры будут обновлены в SWF-файле Flash и начнут фильм заново с первого кадра. Так что я рад наконец разобраться с этим!:)

Вот мой обновленный код Flex:

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()" />
...