0

ゲームで最初のプリローダーを実現しようとしています。私はかなりの実験をしましたが、ここに私が見つけたものがあります。

まず、ファイルをシミュレートすると、ファイルが完全に読み込まれるまで、空白の白い画面が表示されます...または実際には、現在使用している大きな画像だけです。Bandwidth Profiler を使用して、何が起こっているかを確認しました。適切な速度でロードされており、ロードの割合が増加していることがわかります。残念ながら、私のローダーは表示されません。奇妙なことに、フレーム 0 にあると表示されます。なぜそれが私にこれを言っているのか分かりません。

それを修正するために私がしたこと。ゲーム内のすべてのムービークリップで、最初のフレームでエクスポートするためのボックスがチェックされていないことを確認しましたが、プリローダーを除いて、問題にはなりません。また、空白の .fla ファイルを作成し、プリローダーをインポートして実行しました。驚いたことに、うまくいきました!(もう一度、大きな画像をロードしました)。私は何も変更していません....すべて同じ名前とものです。なぜこれが機能し、これが機能しないのか、私にはわかりません。

私のタイムラインは基本的に次のとおりです。私も言ったように、プリローダーは最初のフレームにロードする必要があると思います。ロードが完了すると、タイムラインをフレーム 3 まで実行します。ここで、フレーム 3 のアクションも入れているため、メイン ゲームの実行を開始する必要があります。

これが私のドキュメントクラスです

package com.classes 
{
    import flash.display.MovieClip;
    import flash.display.Stage;
    import flash.display.Sprite;
    import flash.events.Event;

    public class DocumentClass extends MovieClip
    {

        private var preloader:ThePreloader;
        public static var enemyList1:Array = new Array();
        // moved stickobject1 to a class variable.
        private var stickobject1:Stickman2;

        private var scoreHud:ScoreHud;

        public function DocumentClass() : void
        {
            preloader = new ThePreloader(390, this.loaderInfo);
            stage.addChild(preloader);
            preloader.addEventListener("loadComplete", loadAssets);
            preloader.addEventListener("preloaderFinished", showSponsors);

            var bg1:background1 = new background1();
            stage.addChild(bg1);

            stickobject1 = new Stickman2(stage);
            stage.addChild(stickobject1);

            stickobject1.x=50;
            stickobject1.y=300;

            //running a loop now.... so we can keep creating enemies randomly.
            addEventListener(Event.ENTER_FRAME, loop, false, 0, true);
            stickobject1.addEventListener("hit", stickobject1Hit, false, 0, true);
            scoreHud = new ScoreHud(stage); //create our HUD
            stage.addChild(scoreHud); //and display it.

        }

        private function loadAssets(e:Event) : void
        {
            this.play();
        }

        private function showSponsors(e:Event) : void
        {
            stage.removeChild(preloader);
            trace("show sponsors");
        }

        //our loop function
        private function loop(e:Event) : void
        {
            //run if condition is met.
            if (Math.floor(Math.random() * 40) == 5)
            {
                //create our enemyObj1 
                var enemyObj1:Enemy1 = new Enemy1(stage, stickobject1);

                //listen for enemyObj1 being removed from stage
                enemyObj1.addEventListener(Event.REMOVED_FROM_STAGE, removeEnemyObj1, false, 0, true);
                enemyObj1.addEventListener("killed", enemy1Killed, false, 0, true);
                enemyList1.push(enemyObj1);

                stage.addChild(enemyObj1);
            }   
        }

        private function enemy1Killed(e:Event) : void
        {
            scoreHud.updateKills(1); //add 1 to enemy kills
            scoreHud.updateScore(e.currentTarget.points); //add that points variable we created earlier
        }

        private function stickobject1Hit(e:Event) : void
        {
            scoreHud.updateHits(1); //add 1 to number of hits
        }

        private function removeEnemyObj1(e:Event)
        {
            enemyList1.splice(enemyList1.indexOf(e.currentTarget), 1);
        }


    }

}

これが私の「ThePreloader」クラスです

package com.classes
{
    import flash.display.LoaderInfo;
    import flash.display.MovieClip;
    import flash.events.*;

    public class ThePreloader extends MovieClip
    {

        private var fullWidth:Number; //the width of our mcPreloaderBar at 100%
        public var ldrInfo:LoaderInfo;

        public function ThePreloader(fullWidth:Number = 0, ldrInfo:LoaderInfo = null) 
        {
            this.fullWidth = fullWidth;
            this.ldrInfo = ldrInfo;

            addEventListener(Event.ENTER_FRAME, checkLoad);
        }

        private function checkLoad (e:Event) : void
        {
            if (ldrInfo.bytesLoaded == ldrInfo.bytesTotal && ldrInfo.bytesTotal != 0)
            {
                //loading complete
                dispatchEvent(new Event("loadComplete"));
                phaseOut();
            }

            updateLoader(ldrInfo.bytesLoaded / ldrInfo.bytesTotal);
        }

        private function updateLoader(num:Number) : void
        {
            //num is a number between 0 and 1
            mcPreloaderBar.width = num * fullWidth;
        }

        private function phaseOut() : void
        {   
            removeEventListener(Event.ENTER_FRAME, checkLoad);
            phaseComplete();
        }

        private function phaseComplete() : void
        {   
            //go on to the next phase
            dispatchEvent(new Event("preloaderFinished"));  
        }


    }

}

私の主な混乱は、Bandwidth Profiler が、フレーム 0 で停止していて、ほぼ 100% ロードされるまで停止していると表示する理由です。したがって、プリローダーを表示することはありません....ありがとう!

4

1 に答える 1

0

プリローダーはLoaderInfo の progress イベントをリッスンする必要があると思います。実行を停止したので、ENTER_FRAME が呼び出されるとは思いません。また、AFAIR、シングル フレーム ムービーはプレーヤーによって特別に扱われ、プレーヤーは定期的に ENTER_FRAME を送信します。おそらく、それがアプリケーションのテストがうまくいった理由です。

于 2013-07-14T14:09:42.827 に答える