Проблемы предварительной загрузки с экспортом на фрейм 2 - PullRequest
0 голосов
/ 22 марта 2011

Извините за заголовок, я не совсем уверен, как объяснить это несколькими словами.

Я просмотрел поиски в Google и обнаружил, что люди находят его проще при экспорте классов в кадре 2, когдаиспользуя предварительный загрузчик.В настоящее время я использую обычный метод: иметь кадр 1 с предварительным загрузчиком, кадр 2 с держателем ресурсов и большую часть игры, а в кадре 3 есть stop ();действие.Это руководство, которому я следовал, чтобы получить работающий прелоадер AS Gamer .

. После многих часов поиска я нашел только упоминания и оценки людей, использующих экспорт в кадре 2 вместо традиционного держателя активов, но без примеров или учебных пособий.

Кто-нибудь знает, где можно найти учебное пособие с примером кода, на который я ссылаюсь, чтобы получить экспорт в предзагрузчик 2-го кадра?

1 Ответ

2 голосов
/ 23 марта 2011

Я намеревался написать полное руководство по теме preloaders, но я все еще в процессе запуска моего нового сайта ... до тех пор, вот основные моменты:

Нам понадобятся две части -

одна на стороне javascript: отправка flashvars в preloader и встраивание flash-объекта в структуру html.Я люблю swfobject за его простоту и пуленепробиваемость.

html:

<html>
  <head>
  <script type="text/javascript" src="/javascript/swfobject/swfobject.js"></script>
  <script type="text/javascript" src="/javascript/logic.js"></script>
  </head>
  <body>
    <div id="flashContainer">content for when swfobject fails</div>
  </body>
</html>

logic.js:

var _flashvars  =
    {
        filePath    : "/flash/swf/yourcontent.swf",
        FR          : "60",
        verbose     : "false",
        SW          : "760",
        SH          : "550"
    };

var _params     =
    {
        quality     : 'high',
        menu        : 'false',
        base        : '/flash/swf/'
    };

var _attr =
    {
        id          : "flashContainer"
    };

function embedSWF()
    {
        swfobject.embedSWF(
                "/flash/preLoader.swf",
                "flashContainer",
                "760",
                "550",
                "9.0.0",
                "/javascript/swfobject/expressInstall.swf",
                _flashvars,
                _params,
                _attr 
                );
        return;
    }

//onload event
embedSWF()

Со стороны флэш-памяти у нас есть предзагрузчик fla (или как вы его строите).Это целенаправленно «контентно-независимый», потому что я использую его для всей предварительной загрузки.Я полагаю, вы могли бы сэкономить некоторое время, жестко запрограммировав флэш-переменные.В любом случае, у меня есть два класса -

Main.as - который загружает flashvars во время выполнения, инициирует загрузку, а затем отвечает на процесс загрузки, наконец добавляя загруженный контент в список отображения.

Preloader.as - который выполняет всю тяжелую работу.

Обратите внимание, что это частичные классы, извлеченные непосредственно из моего проекта, и я включил только основные элементы (вам придется закончитькод и портной при необходимости).

Обратите внимание, что это один из многих способов сделать это;)

Main.as:

 package {

            public class Main extends MovieClip 
            {
                private var _loadParams         :Object;
                private var _filePath           :String;
                private var _frameRate          :uint;
                private var _stageH             :Number;
                private var _stageW             :Number;
                private var _verbose            :Boolean;

                public function Main():void 
                {
                    super();

                    if (stage)
                    {
                        init();
                    }
                    else 
                    {
                        this.addEventListener(Event.ADDED_TO_STAGE, init, false, 0, true);
                    }
                }

                /**
                 * once preloader is onstage, create param object. 
                 * assign vars from param object
                 * 
                 * stage height / stage width: 
                 * some files may have SH and SW defined, if they are, used them as 
                 * stage dimensions. If they are not, default to current stageHeight,Width
                 * 
                 * @param   e
                 */
                private function init(e:Event = null):void 
                {
                    this.removeEventListener(Event.ADDED_TO_STAGE, init);

                    stage.align = StageAlign.TOP_LEFT;
                    stage.scaleMode = StageScaleMode.NO_SCALE;

                    _loadParams = new Object();
                    _loadParams = LoaderInfo(stage.loaderInfo).parameters;

                    _filePath   = String(   parseParam( "filePath", "undefined.swf"             ) );
                    _frameRate  = uint(     parseParam( "FR",       "24"                        ) );

                    _stageH         = Number(   parseParam( "SH",       String(stage.stageHeight)   ) );
                    _stageW         = Number(   parseParam( "SW",       String(stage.stageWidth)    ) );

                    ( String( parseParam( "verbose", "true" )) == "true")?_verbose = true : _verbose = false;

                    initiateLoader();
                }

                private function parseParam(name:String, defaultValue:String):String
                {
                    if (_loadParams.hasOwnProperty(name) && _loadParams[name] != "" && _loadParams[name] != "undefined") 
                    {
                        return _loadParams[name];
                    }
                    else
                    {   
                        return defaultValue;
                    }
                }

                private function initiateLoader():void
                {
                    _loader = new PreLoader(_filePath, _verbose);
                    _loader.addEventListener("displayObjectLoaded", onLoadComplete, false, 0, true);
                    this.addEventListener(Event.ENTER_FRAME,    setLoadPercentage,  false,  0,  true); 
                }


                /**
                * respond to load graphically
                */
                private function setLoadPercentage(e:Event):void 
                {
                    _loadPercentage = Math.round((_loader.progressNumberArray[0] /_loader.progressNumberArray[1])*100);
                    if (_verbose)
                    {
                    _txt.text = String(_loadPercentage) + "% Loaded";
                    }
                }

                /**
                 * finally, add the loader object into the display list.
                 */
                private function onLoadComplete(evt:Event):void 
                {
                    _loader.removeEventListener("displayObjectLoaded", onLoadComplete);
                    this.removeEventListener(Event.ENTER_FRAME, setLoadPercentage);

                    this.addChild(_loader);         
                }

Preloader.как

package {

    import flash.display.*;
    import flash.events.*;
    import flash.net.URLRequest;
    import flash.text.TextField;

    public class PreLoader extends Sprite {

        private var _loader             : Loader;
        private var _loaderInfo         : LoaderInfo;
        private var _verbose            : Boolean = false;
        private var _loadProgressString : String = "";
        private var _bytesLoaded        : Number = 0;
        private var _bytesTotal         : Number = 0;

        public function PreLoader(path:String, verbose:Boolean) 
        {
            _verbose    = verbose;

            _loader     = new Loader();
            _loaderInfo = _loader.contentLoaderInfo;

                // there are several other events to listen for and respond to
            _loaderInfo.addEventListener(ProgressEvent.PROGRESS,    onProgress, false, 0, true);
            _loaderInfo.addEventListener(Event.COMPLETE,            onComplete, false, 0, true);

            try 
            {
                _loader.load(new URLRequest(path));

            } 
                catch (evt:Error) 
            {
                _loader.unload();

                var errMsg:TextField = new TextField();
                with (errMsg) {
                    width       = 300;
                    text        = "Unable to load content:\n" + evt.toString();
                }
                addChild(errMsg);
                dispatchEvent(new Event("displayObjectLoaded"));
            }
        }

            private function onProgress(evt:ProgressEvent):void 
        {
            var loadPercent:int = Math.round((evt.bytesLoaded / evt.bytesTotal) * 100);
            _bytesLoaded        = evt.bytesLoaded;
            _bytesTotal         = evt.bytesTotal;
            _loadProgressString = (loadPercent + " % loaded: " + _bytesLoaded + " bytes of " + _bytesTotal + " total bytes");
            if (_verbose) 
                {
                trace(_loadProgressString);
            }
        }


        private function onComplete(evt:Event):void 
        {
            _loaderInfo.removeEventListener(Event.COMPLETE,         onComplete);
            _loaderInfo.removeEventListener(ProgressEvent.PROGRESS, onProgress);


            addChild(_loader);
            dispatchEvent(new Event("displayObjectLoaded"));
        }

            /**
             * getter for load details
             */
        public function get progressNumberArray():Array 
        {
            return [_bytesLoaded,_bytesTotal];
        }

Надеюсь, это поможет вам начать.Дайте мне знать, если у вас есть какие-либо вопросы.

ура!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...