Могу ли я передать параметры в Flex 3 переменным в SWF-файл, используя swfloader?
Я создал Flash Animation (CS5, ActionScript 3) и преобразовал его в SWF. Для анимации flash требуются значения 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;
}
}
Мой гибкий код:
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 ответа
Хорошо, я выяснил, что случилось. Как предположил 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()" />
Если 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();
}
Это решило бы проблему?
РЕДАКТИРОВАТЬ
Также вы можете попробовать изменить 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);
}