1

swfソースが埋め込まれているSWFをプリロードしようとしています。しかし、それは機能したくありません。単純なプリロードを試しましたが、進行状況イベントはロード後にのみ実行されます。何か案が?

public class MainShell extends MovieClip 
    {       
        [Embed(source = "Main.swf")]
        public var cs:Class;
        public var hsf8z42fdfd_as32:MovieClip;
        public function MainShell()
        {
            addEventListener(Event.ADDED_TO_STAGE, initialize, false, 0, true);
        }
        private function initialize(e:Event) {
            loaderInfo.addEventListener(IOErrorEvent.IO_ERROR, error, false, 0, true);
            loaderInfo.addEventListener(ProgressEvent.PROGRESS, progress, false, 0, true);
            loaderInfo.addEventListener(Event.COMPLETE, loaded, false, 0, true);
        }
        private function progress(e:ProgressEvent) {
            var done:Number = stage.loaderInfo.bytesLoaded;
            var total:Number = stage.loaderInfo.bytesTotal;
            var w:int = done / total * 100;
            loading.TT.text = String(w);
        }
        private function loaded(e:Event) {
            loading.parent.removeChild(loading);
            hsf8z42fdfd_as32 = new cs();
            hsf8z42fdfd_as32.addEventListener(Event.COMPLETE, onComplete);
        }
        private function error(e:IOErrorEvent):void{
            trace("Error!");
        }
        public function onComplete(e:Event) {
            addChild(hsf8z42fdfd_as32);
        }


プログレス関数は、ファイルが実際にロードされた後に1回だけ実行されるようです。進行状況イベントはロード中に実行する必要がありますが、なぜ実行されないのですか?

4

3 に答える 3

2

埋め込みオブジェクトをプリロードすることはできません。埋め込みオブジェクトの概念は、コンテナに同梱されていることです。

これは、MainShellにMain.swfが含まれている場合と同じです。

つまり、埋め込みオブジェクトを含むクラスがクラスローダーによって(メモリに)ロードされるとすぐに、すべての依存関係(埋め込みオブジェクトを含む)が同時に存在することになります。そして、その後になって初めて内部のコードが実行されるため、読み込みの進行状況を確認できません。

コンテンツローダーは、サーバーからリモートコンテンツをロードするためのものです。これにより、HTTP GETリクエストの進行状況が表示されます(まだブラウザのキャッシュにない場合)。

読み込みの進行状況バーなどを表示する場合は、埋め込みコンテンツを使用しないでください。

こんにちは

M。

于 2012-09-24T15:17:24.980 に答える
1

この問題の解決策を共有するためにここに戻りました。

これは実際に可能です。ただし、プロジェクトでライブラリアセットまたはタイムラインコードを使用している場合、ソリューションはそれほど簡単には機能しません。このソリューションでは、プロジェクトが主にAS3クラスである必要があるため、これを機能させるにはコードを調整する必要がある場合があります。

まず、Flex SDK( http://www.adobe.com/devnet/flex/flex-sdk-download.html )をダウンロードする必要があります。これを使用して、as3クラスを.swfにコンパイルします(Flexがプロジェクトを混乱させることはありません。心配しないでください)。初期設定後にこれに戻ります。

次に、FlexSDKで文書化されていないトリックであるFrameメタデータタグを使用します。http://www.bit-101.com/blog/?p=946のブログで詳細を説明していますが、Frameタグを使用すると、基本的に、クラスを呼び出すことなく、後でクラスを呼び出すことなく、クラスを埋め込むことができます。コード/埋め込み。これは、パッケージ定義の後、Mainクラスのクラス定義の前に、次のように貼り付けます。

package {
    import flash.net.utils.ByteArray;
    import flash.display.Sprite;

    [SWF(width="720", height="480", frameRate="30", backgroundColor="#000000")] //we need this definition when compiling with mxmlc

    [Frame(factoryClass="com.aierou.game.Preloader")] //the factory class takes priority, so we'll use it as a preloader
    public class Main extends Sprite{

        [Embed(source="asset.swf")] //big asset to preload
        var assetClass:Class;

        public function Main(){
            // constructor code
        }
    }
}

つまり、これはコンパイラーに.swfを2つのフレームに分割するように指示します。1つはプリローダー用で、もう1つはアプリケーション用です。

次に、実際にゲームをプリロードするためのプリローダークラスを作成する必要があります。これを行う方法の例:

package com.aierou.game{
    import flash.display.DisplayObject;
    import flash.display.MovieClip;
    import flash.events.Event;
    import flash.utils.getDefinitionByName;

    public class Preloader extends MovieClip{ //should extend MovieClip for onEnterFrame action
        public function Preloader() {
            stop();
            addEventListener(Event.ENTER_FRAME,onEnterFrame);
        }

        public function onEnterFrame(e:Event){
            var total:Number = this.stage.loaderInfo.bytesTotal;
            var loaded:Number = this.stage.loaderInfo.bytesLoaded;
            if(total==loaded){
                removeEventListener(Event.ENTER_FRAME,onEnterFrame);
                nextFrame();
                init();
            }else{
                //show preloader progress
            }
        }

        private function init(){
            //Add the main class to the stage it's done this way to prevent the compiler from sticking embeds at the start
            var mainClass:Class=Class(getDefinitionByName("Container"));
            if(mainClass){
                var app:Object=new mainClass();
                addChild(app as DisplayObject);
            }
        }
    }
}

これでメインクラスとプリローダーが設定されたので、プロジェクトをコンパイルする準備が整いました。これがFlexSDKの出番です。この部分ではコマンドラインを使用するため、SDKbinフォルダーを「パス」環境変数に追加することをお勧めします。ベストプラクティスには、プロジェクトのルートディレクトリに.batファイルを設定して、プロジェクトのコンパイルを容易にすることが含まれます。私が使用する.batは、次のように設定されています。

mxmlc -frame two Main -- Main.as
start /wait Main.swf

mxmlcはプロジェクトをコンパイルし、メインクラスを「two」というラベルの付いた新しいフレームに配置します。メインクラスのFrameタグは、コンパイラにプリローダーを最初のフレームに配置するように強制します。

コンパイラエラーが発生しない場合:おめでとうございます!プロジェクトに真のプリローダーを追加しました!

于 2014-02-15T20:37:43.730 に答える
0

Event.COMPLETEリスナーをcsインスタンスのcontentloaderInfoに追加して変更してみてください

hsf8z42fdfd_as32.addEventListener(Event.COMPLETE, onComplete);

hsf8z42fdfd_as32.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
于 2012-09-18T17:25:55.183 に答える