Flex 3のパラメーターをSWFLoaderを使用してSWFファイルの変数に渡すことはできますか?

StackOverflow https://stackoverflow.com/questions/5821382

質問

フラッシュアニメーション(CS5、ActionScript 3)を作成し、SWFに変換しました。 Flashアニメーションは、Flexアプリケーションで実行を開始する前に、3つの変数(SWFタイムラインで定義)の値を必要とします。 SWFローダーをFlexで使用してSWFファイルを埋め込みましたが、アニメーションが始まる前にパラメーターをFlexからFlashに渡す必要があります。どうすればいいですか?

以下のフレックスコードのセットアップの方法では、変数は更新されていません。 「タイプ」、「num1」などが見つからないため、ChangeParams関数に到達するたびに例外を取得します。

フラッシュコードの一部:

//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が示唆したように、「init」ではなく「完全」で機能するように関数を変更しましたが、SWFをSWFローダーに埋め込むのをやめるまで、ChangeParams()は実行されませんでした。私はそれが私の元の投稿でそれをやっていた方法だとは思っていませんでした - 私のエラー。 @embedに埋め込もうとすると、期待しても「完全な」イベントは実行されません。

私がしたもう1つのことは、「gotoandplay(1)」を追加することでした。そのため、パラメーターが設定された後に最初のフレームを再生することでした。 Anemgyengeが示唆したように、Flashコードの先頭にStop()を追加して、Flexがそれを伝えるまで再生されません。バインディングセッターを使用して、Flex Changesの変数の1つを変更すると、パラメーターがFlash SWFで更新され、フレーム1で映画を開始します。 :)

これが私の更新されたフレックスコードです:

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 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);
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top