1

SWFのメインタイムラインで、いくつかのレイヤー、いくつかの関数、およびいくつかのキーフレームラベルを使用してフラッシュアニメーションを作成しています。たとえば、画面に出くわした星のムービークリップがあり、メインタイムラインのdispatchEventをトリガーして、フレームラベル「next」に移動します。

メインタイムラインで使用されるアクションスクリプトのサンプルは次のとおりです。

Stars.addEventListener("fadeInTitle",_fadeInTitle);

function _fadeInTitle(e:Event):void {
    Title.gotoAndPlay("fadeIn");
    Stars.removeEventListener("fadeInTitle",_fadeInTitle);
}

stop();

そのSWFだけでも完璧に機能します。このSWFを別のSWFにロードしようとすると問題が発生します。何が起こるかというと、ローダーはSWFを何度もリロードし続け、それらをオーバーラップさせ、ロードされたSWFのメインタイムラインにあるアクションスクリプトは無視され、タイムラインは継続的に再生されます。SWFをロードするために使用するコードは次のとおりです。

import flash.net.URLRequest;
import flash.display.Loader;
import flash.events.Event;
import flash.events.ProgressEvent;

function startLoad(){
    var mLoader:Loader = new Loader();
    var mRequest:URLRequest = new URLRequest("Fly.swf");
    mLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onCompleteHandler);
    mLoader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgressHandler);
    mLoader.load(mRequest);
}

function onCompleteHandler(loadEvent:Event){
    addChild(loadEvent.target.content);
}

function onProgressHandler(mProgress:ProgressEvent){
    var percent:Number = mProgress.bytesLoaded/mProgress.bytesTotal;
}

startLoad();

そこには特別なことは何もありません。単純なローダー。

アニメーション全体を1つのメインムービークリップ内に配置し、そのムービークリップをメインタイムライン(1つのキーフレーム、1つのレイヤー、アクションスクリプトなし)に配置してからロードすることで、回避策を見つけました。そうすれば問題なく動作しますが、ソリューションというよりはパッチのように感じます。複数のレイヤー、キーフレーム、アクションスクリプトを含むメインタイムラインを使用する外部SWFを読み込もうとすると、なぜバグが発生するのかを知りたいと思います。

ヘルプ/ヒントをいただければ幸いです。
読んでくれてありがとう。

m

4

1 に答える 1

0

まず、ローダーのインスタンス化を関数から削除します。これは必要ありません。次に、onComplete関数でリスナーを強制終了します。第3に、このローダーコードがローダーシェルのタイムライン上にある場合は、フレームが1つ以下であることを確認するか、フレームがある場合(理由はわかりません)、ローダーコードを含むフレームに停止します。または、タイムラインに配置するのではなく、Documentクラスを使用してローダーコードを含めることをお勧めします。私の最も良い推測は、あなたがどういうわけかもう一度startLoad()を呼び出していたということです。また、フラッシュデバッグプレーヤーがインストールされていることを確認してください。これにより、ブラウザーでこれを表示したときに適切なエラーレポートが表示されます。

var mLoader:Loader = new Loader();
var mRequest:URLRequest = new URLRequest("Fly.swf");
mLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onCompleteHandler);
mLoader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgressHandler);
mLoader.load(mRequest);


function onCompleteHandler(loadEvent:Event)
{
    mLoader.contentLoaderInfo.removeEventListener(Event.COMPLETE, onCompleteHandler);
    mLoader.contentLoaderInfo.removeEventListener(ProgressEvent.PROGRESS, onProgressHandler);
    addChild(loadEvent.target.content);
}

function onProgressHandler(mProgress:ProgressEvent)
{
    var percent:Number = mProgress.bytesLoaded/mProgress.bytesTotal;
}
于 2011-02-18T22:02:53.047 に答える