0

我创建了一个 Flash 动画(CS5、ActionScript 3)并将其转换为 SWF。Flash 动画在它开始在我的 Flex 应用程序中运行之前需要 3 个变量的值(在 swf 时间轴中定义)。我已经在 Flex 中使用 swfloader 嵌入了 swf 文件,但是我需要在动画开始之前将参数从 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()" />
4

2 回答 2

2

如果idAnimation是开头嵌入的movieclip的实例名称,那么它也是一个很好的方法,您可以在您的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);
}
于 2011-04-28T16:44:34.070 回答
0

好的,所以我发现了问题所在。正如 anemgyenge 建议的那样,我将函数更改为在“完成”而不是“初始化”时运行,但 changeParams() 直到我停止尝试将 swf 嵌入到 swfloader 时才运行。我想我并没有在我的原始帖子中包含我的做法——我的错误。如果您尝试使用@embed 嵌入,它不会在您期望的时候运行“完成”事件。

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

这是我更新的 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()" />
于 2011-07-26T21:49:01.497 回答