我可以使用swfloader将Flex 3中的参数传递给swf文件中的变量吗?

时间:2011-04-28 15:47:48

标签: flash variables parameters flex3 swfloader

我创建了一个Flash动画(CS5,ActionScript 3)并将其转换为SWF。在我的Flex应用程序中开始运行之前,flash动画需要3个变量的值(在swf时间轴中定义)。我在Flex中使用swfloader嵌入了swf文件,但我需要在动画开始之前将Flex中的参数传递给Flash。我该怎么做?

我在下面设置灵活代码的方式,变量没有更新。每次到达changeParams函数时我都会收到异常,因为它找不到“Type”,“Num1”等。

我的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;
}
}

我的灵活代码:              

        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 个答案:

答案 0 :(得分:2)

如果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);
}

答案 1 :(得分:0)

好的,所以我发现了什么是错的。正如anemgyenge建议的那样,我将我的功能更改为“完成”而不是“init”,但是changeParams()从未运行,直到我停止尝试将swf嵌入swfloader。我想我没有包含这是我在原来的错误中做的原因。如果您尝试使用@embed嵌入,则它不会在您期望的情况下运行“完整”事件。

我做的另一件事是添加一个“gotoAndPlay(1)”,这样它就会在参数设置后播放第一帧。正如anemgyenge建议的那样,我在我的Flash代码的开头添加了stop(),因此在Flex告诉它之前它不会播放。我使用绑定设置器来运行changeParams(),只要我的Flex中的一个变量发生变化,所以参数将在Flash SWF中更新,并在第1帧开始播放电影。很高兴终于搞清楚了! :)

这是我更新的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()" />