Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Правильно ли я сделал прелоадер (http://www.flasher.ru/forum/showthread.php?t=170870)

ЗлОй ПрОграММер 03.11.2011 21:10

Правильно ли я сделал прелоадер
 
Есть приложение в нём несколько классов включая класс preloader и startApp(запустить приложение)
в классе preloader добавляю слушатели
Код AS3:

loaderInfo.addEventListener(ProgressEvent.PROGRESS, progress);
loaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioError);

затем
Код AS3:

private function progress(e: ProgressEvent): void 
{
//----------------------------------------------------------------------
        if (e.bytesLoaded == e.bytesTotal)
        {
                appLoaded = true;
                startApp();
                loaderInfo.removeEventListener(ProgressEvent.PROGRESS, progress);
                loaderInfo.removeEventListener(IOErrorEvent.IO_ERROR, ioError);
        }
//----------------------------------------------------------------------
}

правильно ли всё организованно ?

Wolsh 03.11.2011 21:23

Нет.
что такое startApp(); ? Из Вашего текста явствует, что класс? Класс это не действие, класс это существительное. А здесь я вижу вызов какой-то функции.

ЗлОй ПрОграММер 03.11.2011 21:29

ну и как же быть ? делать прелоадер в отдельном swf или можно всё в одном swf уместить и прелоадер и само приложение ?

Wolsh 03.11.2011 21:37

Конечно можно. На FlashDevelop переходить не собираетесь? Там есть шаблон проекта с прелоадером. Если поискать, на этом форуме его не раз выкладывали и обсуждали.

ЗлОй ПрОграММер 03.11.2011 21:47

так он родимый и есть)

carrotoff 03.11.2011 21:50

Цитата:

так он родимый и есть)
Ну тогда выбирайте New Project -> AS3 Project with Preloader. Велосипед изобрели до вас:)

ЗлОй ПрОграММер 03.11.2011 21:55

Код AS3:

package 
{
 
        import flash.display.DisplayObject;
        import flash.display.MovieClip;
        import flash.display.StageAlign;
        import flash.display.StageScaleMode;
        import flash.events.Event;
        import flash.events.IOErrorEvent;
        import flash.events.ProgressEvent;
        import flash.utils.getDefinitionByName;
 
        /**
        * ...
        * @author
        */

        public class PreloaderClass extends MovieClip
        {
 
                public function PreloaderClass()
                {
                //----------------------------------------------------------------------
                        if (stage)
                        {
                                stage.scaleMode = StageScaleMode.NO_SCALE;
                                stage.align = StageAlign.TOP_LEFT;
                        }
                //----------------------------------------------------------------------
                        addEventListener(Event.ENTER_FRAME, checkFrame);
                        loaderInfo.addEventListener(ProgressEvent.PROGRESS, progress);
                        loaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioError);
                //----------------------------------------------------------------------       
                        // TODO show loader
                //----------------------------------------------------------------------
                }
 
                private function ioError(e: IOErrorEvent): void
                {
                //----------------------------------------------------------------------
                        trace(e.text);
                //----------------------------------------------------------------------
                }
 
                private function progress(e: ProgressEvent): void
                {
                //----------------------------------------------------------------------
                        // TODO update loader
                //----------------------------------------------------------------------
                }
 
                private function checkFrame(e: Event): void
                {
                //----------------------------------------------------------------------
                        if (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("MainClass") as Class;
                        addChild(new mainClass() as MovieClip);
                //----------------------------------------------------------------------
                }
 
        }
 
}

чёт не пойму и чем же от моего отличается ?
Код AS3:

package app 
{
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.display.Loader;
        import flash.events.MouseEvent;
        import flash.utils.ByteArray;
        import flash.events.IOErrorEvent;
        import flash.events.ProgressEvent;
        import flash.text.TextField;
 
        /**
        * ...
        * @author
        */

        public class cPreloader extends Sprite
        {
 
                public var appLoaded: Boolean = false;
 
                public function cPreloader()
                {
                //----------------------------------------------------------------------
                        if (stage) Initialization()
                        else addEventListener(Event.ADDED_TO_STAGE, Initialization);
                //----------------------------------------------------------------------
                }
 
                private function Initialization(e: Event = null): void
                {
                //----------------------------------------------------------------------               
                        loaderInfo.addEventListener(ProgressEvent.PROGRESS, progress);
                        loaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioError);
                        removeEventListener(Event.ADDED_TO_STAGE, Initialization);
                //----------------------------------------------------------------------
                }
 
                private function progress(e: ProgressEvent): void
                {
                //----------------------------------------------------------------------
                        if (e.bytesLoaded == e.bytesTotal)
                        {
                                appLoaded = true;
                                parentInstance.startApp();
                                loaderInfo.removeEventListener(ProgressEvent.PROGRESS, progress);
                                loaderInfo.removeEventListener(IOErrorEvent.IO_ERROR, ioError);
                        }
                //----------------------------------------------------------------------
                }
 
                private function ioError(e: IOErrorEvent): void
                {
                //----------------------------------------------------------------------
                        //errorText.text = String(e);
                //----------------------------------------------------------------------
                }
 
 
 
        }
 
}

немного изменил а так тож самое

Wolsh 03.11.2011 23:01

Каких Вы хотите ответов, если не отвечаете на вопросы? Я спросил Вас, что такое startApp()? Вместо ответа Вы добавили загадок - теперь у Вас есть parentInstance.startApp(); Причем что такое parentInstance, знаете только Вы, ибо такой переменной в коде класса нет. Как ответить Вам, чем Ваш код отличается от шаблона ФД? Методом дедукции (исключения) я могу заключить, что "отцовскийЭкземпляр" как-то связан с главным классом самого приложения (потому как больше этому классу в вашем коде прятаться негде). Поскольку переменной нет, видимо это класс, хоть и написан с маленькой буквы. В импорте он отсутствует, видимо по причине того что лежит в той же директории/находится в том же пакете. Если я прав, то отличие именно в этом. В прелоадере от ФД главный класс НИКАК не импортируется в класс прелоадера. Потому что в этом случае он притянет за собой ВЕСЬ остальной код и соотв. все используемые в swf-файле ресурсы. И прелоадер не будет добавлен на сцену, пока не загрузится ВСЯ флэшка. А после этого, как ВЫ понимаете, прелоадер никому уже не нужен. Должен прогрузиться первый кадр с прелоадером, все что нужно для показа этого кадра. Когда кадр прогрузится, плеер отобразит его и начнет грузить второй кадр, в котором как раз и находятся все классы и ресурсы приложения. В это время прелоадер уже "на сцене" и показывает прогресс загрузки. Видите разницу? Два кадра и разделение ресурсов по кадрам – вот чего нет у Вас, чтобы прелоадер стал ПРЕлоадером.

ЗлОй ПрОграММер 04.11.2011 00:50

startApp(запустить приложение). добавляет на сцену фон приложения ну и т.д.
а насчёт структуры
1. Есть главный экземпляр класса который создаёт 2 экземпляра классов (preloader и app) первый это прелоадер, а второй экземпляр приложения. и когда в прелоадере e.bytesLoaded == e.bytesTotal я через главный класс добавляю экземпляр класса app

-De- 04.11.2011 01:23

Ага, вся флэшка в одном кадре явно.
Смотрите, как работает встроенный предзагрузчик:
Если у главного таймлайна более одного кадра, то плеер, когда загрузит первый кадр, начинает выполнять то, что в нём есть. Потому этот кадр используют для предзагрузчика. Который не покажется, пока не загрузится всё, что есть в первом кадре. Который ждёт, пока не загрузится всё и показывает всякое. Чтобы было более одного кадра "AS3 Project with Preloader" использует метатег [Frame] в классе MainClass. И чтобы в первом кадре не было этого MainClass, фона приложения и т.д. - используют getDefinitionByName. Потому что как только в каком-то кадре будет упомянуто имя класса не как строка (в getDefinitionByName) - то этот класс будет вкомпилен в этот кадр. Также будут вкомпилены все классы, которые упоминаются в этом классе не как строка и классы, которые упоминаются в тех классах итд.


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

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