1

プリローダーに関する以前のトピックがたくさんあることを知っており、それらのすべてに従おうとしましたが、それでも同じ問題が発生します (まあ、それらは私が 80% から 50% に移行するのに役立ちました) 61450 / 125207。約50%です。

これが私のMain Document(プロジェクト全体のデフォルトのクラスファイル)クラスです:

public class MainDocument extends MovieClip
{
    private var preloader:Preloader;
    private var sB:startButton;
    public function MainDocument() 
    {
        preloader = new Preloader();
        preloader.x = 300;
        preloader.y = 400;
        addChild(preloader);
        loaderInfo.addEventListener(Event.COMPLETE,addStartButton,false,0,true);
    }
    private function addStartButton(e:Event):void
    {
        sB = new startButton();
        sB.x = 300;
        sB.y = 450;
        sB.addEventListener(MouseEvent.CLICK,sMainMenu,false,0,true);
        addChild(sB);
        loaderInfo.removeEventListener(Event.COMPLETE,addStartButton);
    }
    private function sMainMenu(e:Event):void
    {
        sB.removeEventListener(MouseEvent.CLICK,sMainMenu);
        removeChild(sB);
        removeChild(preloader);
        sB = null;
        preloader = null;           
        var menuScreen = new MenuScreen();
        addChild(menuScreen);

        //I have heard that the following code might work better:
        //var menuScreen:Class = getDefinitionByName("MenuScreen") as Class;
        //addChild(new menuScreen() as DisplayObject);
    }
}

そしてPreloaderそれが添付するもの:

public class Preloader extends MovieClip
{
    public function Preloader()
    {
        addEventListener(Event.ENTER_FRAME,Load);
    }
    private function Load(e:Event):void
    {
        //"bar" is a movieclip inside the preloader object
        bar.scaleX = loaderInfo.bytesLoaded/loaderInfo.bytesTotal;
        //"percent" is a dynamic text inside the preloader object
        percent.text = Math.floor(loaderInfo.bytesLoaded/loaderInfo.bytesTotal*100)+"%";
        trace(loaderInfo.bytesLoaded+" / "+loaderInfo.bytesTotal);
        if (loaderInfo.bytesLoaded == loaderInfo.bytesTotal)
        {
            removeEventListener(Event.ENTER_FRAME,Load);
        }
    }
}

->Export on Frame 1以外には何も設定されていませんPreloader

-> 最初のフレームにオブジェクトが存在しません。最初のフレームの唯一のコードはstop();

-> 2 番目のフレームにすべての MovieClip のコピーを配置し、startButton をクリックすると、gotoAndStop(3);フレーム 2 が表示されないように実行されます。

私が忘れていたかもしれない簡単なことを誰かが知っているなら、私に知らせてください!

ありがとう!

4

3 に答える 3

1

プリロードされているファイルでプリローダーを使用しようとしています。その場合、プロジェクトのコードとアセットの残りの部分が肥大化します。プリローダーが遅延しているように見える理由は、コードを実行する前に swf を完全にロードする必要があるためです。これには、フレーム 1 以外でエクスポートする設定がある場合でも、どのフレーム上にあるかに関係なく、ステージ上のすべてのアセットが含まれます。代わりに、空のシェルをプリローダーとして使用してみてください。このシェルには、ローダー コードとプリローダーのグラフィックまたはアニメーション以外は何も含まれません。読み込みが完了したら、プリローダーを非表示にして、読み込まれたコンテンツをシェルのステージ、またはシェル内のコンテナー ムービークリップに追加します。

次のコードはすべて、このコードとプリローダー バー以外には何も含まれていない単なる別の FLA ファイルであるシェルに入ります。このファイルのサイズは、ロードするファイル (プリロードしようとしていた元の swf ファイル) と同じである必要があります。

loadSwf( "mySwfNameOrURLToSwf.swf" );を呼び出して使用します。 変数_percentには、現在の負荷率が入力されます。これは、負荷バー スケールに対応させることができます。プリローダーバーの名前が「bar」であると仮定すると、行bar.visible = false; onSwfLoaded 関数で非表示にします。 addChild( _swf )は、ロードされた swf をシェルのステージに追加します。行_swf.init(); ロードされたswf内の関数を参照します。init()という名前を追加する必要があります。これは、ロードされたswfを開始して、想定されていることを実行します。init()関数を含め、ロードされた swf のすべてが最初のフレームから開始されるようにします。

import flash.display.MovieClip;
import flash.display.DisplayObject;
import flash.display.Loader;
import flash.display.Bitmap;

import flash.net.URLRequest;

import flash.system.ApplicationDomain;
import flash.system.SecurityDomain;
import flash.system.LoaderContext;
import flash.system.Security;

import flash.events.Event;
import flash.events.ProgressEvent;

var _swfLoader:Loader;
var _swf:DisplayObject;
var _percent:Number;

function loadSwf( swfURL:String ):void
{
    _swfLoader = new Loader();
    var req:URLRequest = new URLRequest( swfURL );

    var loaderContext:LoaderContext = new LoaderContext();
    loaderContext.applicationDomain = ApplicationDomain.currentDomain;
    loaderContext.checkPolicyFile = true;

    _swfLoader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onSwfProgress);
    _swfLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onSwfLoaded);

    _swfLoader.load(req, loaderContext);
}

function onSwfProgress( evt:Event ):void
{
    _percent = Math.round( ( evt.target.bytesLoaded / evt.target.bytesTotal ) * 100 );
}

function onSwfLoaded( evt:Event ):void
{
    _swfLoader.contentLoaderInfo.removeEventListener(ProgressEvent.PROGRESS, onSwfProgress);
    _swfLoader.contentLoaderInfo.removeEventListener(Event.COMPLETE, onSwfLoaded);

    _swf = _swfLoader.content;

    addChild( _swf );
    bar.visible = false;
    _swf.init();

    _swfLoader = null;
}
于 2013-04-02T23:01:33.480 に答える
0

@Lee Burrowsあなたの言ったことは正しかったが、コードの最後に私が言及したこと (3 つの太字) を見ればよかったのに

私が使用した解決策は次のとおりです。 - >すべてをExport on Frame 23フレームドキュメントに設定しました。-> フレーム 2 のすべてを削除 ->TextFieldビア コンストラクターを作成し、drawRectangleバーの読み込みに使用 -> フレーム 1 にムービークリップが存在せず、使用

var menuScreen:Class = getDefinitionByName("MenuScreen") as Class;
addChild(new menuScreen() as DisplayObject);

前のコードの代わりに。

私が最初に持っていたものが機能しなかった理由は、Lee Burrows前述のように、チェックされているかどうかに関係なく、inExport for Actionscriptの場合に読み込みがハングするためです。2に変更するか、チェックを外すことが2つの解決策でした(actionscript用にエクスポートされていない場合を除き、そのコードは参照できません)。X = 1Export on Frame XExport on Frame 1Export for Actionscript

現在、プリローダーは約 2% から開始されます。

于 2013-04-07T00:27:35.773 に答える
0

あなたのコードは大丈夫です。http サーバーを使用していない場合は、ロード プロセスがシミュレートされます。

コンパイル後、crtl + B を押します。メニューで、ダウンロード速度を選択し、もう一度 ctrl+enter を押してダウンロードをシミュレートできます。

プリローダーのデバッグに役立つ場合があります

于 2013-04-02T09:40:00.857 に答える