Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Advanced Preloader (http://www.flasher.ru/forum/showthread.php?t=146371)

boleg 05.11.2010 19:45

Advanced Preloader
 
Привет всем сожителям форума.

[Предыстория]
Есть простой и удобный способ вставить прелоадер в свое приложение - http://www.bit-101.com/blog/?p=946.
Для тех, кому лень читать, поясняю, что суть этого метода в использовании недокументированного мета-тега [Frame(factoryClass="Preloader")], который разбивает твое приложение на 2 кадра, и помещает прелоадер (Preloader) в первый кадр, а основное приложение во второй.

Метод отличный, но декомпилятор показывает, что дополнительно он подключяает 36КБ различных флексовых классов.
[/Предыстроия]

Есть ли возможность воссоздать такую же схему на чистом АС3.
Мои поиски в сторону mxmlc -frames.frame Preloader привели только к созданию 2-кадровой флешки, котороая не вызвает класс Preloader

P.S. Немного поискав я обнаружил вот такой вот прелоадер написанный на Нахе http://www.mindless-labs.com/blog/ar...xe_preloader_u. Он весит 19 КБ и по прежднему включает в себя mx.core.* классы.

Zebestov 05.11.2010 20:41

Я с трудом представляю себе приложение, для которого одновременно справедливы две позиции:

1. 36Kb лишнего веса — кошмар!
2. необходим прелоадер.

ps_spectre 05.11.2010 23:40

boleg, вот пример как можно сделать с помощью -frame

Preloader.as (стандартный, который генерит ФД)
Код AS3:

package 
{
        import flash.display.*;       
        import flash.events.*;       
        import flash.text.TextField;
        import flash.utils.getDefinitionByName;
 
        [SWF(width=800,height=600,frameRate=30,backgroundColor=0xC254DE)]
        public class Preloader extends MovieClip
        {
                private var _txt:TextField = new TextField();
                public function Preloader()
                {
                        if (stage) {
                                stage.scaleMode = StageScaleMode.NO_SCALE;
                                stage.align = StageAlign.TOP_LEFT;
                                addChild(_txt);                               
                        }
                        addEventListener(Event.ENTER_FRAME, checkFrame);
                        loaderInfo.addEventListener(ProgressEvent.PROGRESS, progress);
                        loaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioError);
                }
 
                private function ioError(e:IOErrorEvent):void
                {
                        trace(e.text);
                }
 
                private function progress(e:ProgressEvent):void
                {                       
                        // TODO update loader                       
                        _txt.text = loaderInfo.bytesLoaded.toString();
                }
 
                private function checkFrame(e:Event):void
                {
                        if (loaderInfo.bytesLoaded == loaderInfo.bytesTotal && currentFrame == totalFrames)
                        {                               
                                stop();
                                loadingFinished();
                        }
                }
 
                private function loadingFinished():void
                {
                        removeEventListener(Event.ENTER_FRAME, checkFrame);
                        loaderInfo.removeEventListener(ProgressEvent.PROGRESS, progress);
                        loaderInfo.removeEventListener(IOErrorEvent.IO_ERROR, ioError);                       
                        // TODO hide loader                       
                        startup();
                }
 
                private function startup():void
                {
                        var mainClass:Class = getDefinitionByName("HelloWorldClass") as Class;
                        stage.addChild(new mainClass() as DisplayObject);               
                }               
        }       
}

HelloWorldClass.as
Код AS3:

package 
{
        import flash.display.DisplayObject;
        import flash.display.Sprite;
        import flash.events.Event;
 
        public class HelloWorldClass extends Sprite
        {
//для теста пихаем картинку, чтобы раздуть второй кадр (куда этот класс добавляется)
                [Embed(source = 'someshit.jpg')]
                private var ShitImage:Class;
 
                public function HelloWorldClass():void
                {
                        init();
                }
 
                private function init(e:Event = null):void
                {       
                        addChild(new ShitImage() as DisplayObject);                       
                        var s:Sprite = new Sprite();
                        s.graphics.beginFill(0x098505);
                        s.graphics.drawCircle(100, 100, 100);
                        s.graphics.endFill();
                        addChild(s);
                }
        }
}

компайл:
Код:

mxmlc Preloader.as -frame 1 HelloWorldClass
или с доп.опциями
mxmlc Preloader.as -frame 1 HelloWorldClass -debug -benchmark -keep -dump-config config.xml

и в результате ничего лишнего вообще не добавляется.
первый кадр около 2х килобайт. )

boleg 06.11.2010 00:20

ps_spectre, спасибо работает. Респект как тру-флешеру.

Для тех кто попытается повторить то, о чем говорил ps_spectrе:
1. Необходимо сделать основным классом приложения сам прелоадер. (Preloader.as, клик правой кнопкой мыши, "Always Compile")
2. Аналогичную галочку убрать у класса HelloWorld.as
3. Добавить дополнительные аргументы компиляции.

Цитата:

Я с трудом представляю себе приложение, для которого одновременно справедливы две позиции:

1. 36Kb лишнего веса — кошмар!
2. необходим прелоадер.
Ты прав, 36 КБ совсем не критичны. Я просто искал самый лучший способ.


Часовой пояс GMT +4, время: 04:31.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.