Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   не работает preloader - белый экран (http://www.flasher.ru/forum/showthread.php?t=213012)

a7s1h1 14.06.2016 03:54

не работает preloader - белый экран
 
Здравствуйте!
В сети нашёл огромное количество обсуждений данный проблемы, но ни одно из решений не помогло. Вы моя последняя надежда, выручайте, пожалуйста!
Код пишу во FlashDevelop, графику импортирую его средствами через swc (галочка "Add to library").
Использую чуть модифицированную версию стандартного прелоадера FlashDevelop, который создаётся при выборе "AS3 Project with Preloader" при создании нового проекта.
Вот код прелоадера:
Код AS3:

package
{
        import flash.display.DisplayObject;
        import flash.display.MovieClip;
        import flash.events.Event;
        import flash.events.ProgressEvent;
        import flash.utils.getDefinitionByName;
        import rc.TF;
 
        public class Loader extends MovieClip
        {
 
                private var _txt:TF; // TF - это собственный класс для текста
 
                public function Loader()
                {
                        if (stage) {
                                stage.color = 0x000000; // цвет сцены
                                stage.scaleMode = 'showAll';
                                stage.align = 'C';
                        }
                        addEventListener(Event.ENTER_FRAME, checkFrame);
                        loaderInfo.addEventListener(ProgressEvent.PROGRESS, progress);
 
                        // Создаём индикатор
                        _txt = new TF(360, 210, '', 14, 'center', 0xFFFFFF);
                        addChild(_txt);
                }
 
                // Обновление индикатора
                private function progress(e:ProgressEvent):void {
                        // вычисляем процент загрузки
                        _txt.update('loading...\n' + int(e.bytesLoaded * .001) + '/8516kb');
                }
 
                // проверяем кадр (не проверяем bytesTotal, т.к. некоторые браузеры возвращают 0)
                private function checkFrame(e:Event):void
                {
                        if (currentFrame == totalFrames) {
                                // загрузка закончилась, начинаем
                                loadingComplete();
                        }
                }
 
                private function loadingComplete():void
                {
                        removeEventListener(Event.ENTER_FRAME, checkFrame);
                        loaderInfo.removeEventListener(ProgressEvent.PROGRESS, progress);
                        // убираем индикатор
                        removeChild(_txt);
                        _txt = null;
                        startup();
                }
 
                private function startup():void
                {
                        // получаем ссылку на главный класс нашего приложения
            var mainClass:Class = getDefinitionByName("Game") as Class;
            // создаем объект главного класса
                        addChild(new mainClass() as DisplayObject);
            // удаляем из stage прелодер
            //parent.removeChild(this);
                }
 
        }
 
}

Вот код основного класса:
Код AS3:

package {
 
        import flash.display.Sprite;
        import flash.events.Event;
 
        // вот эта строка сообщает компилятору,
    // что надо показать прелодер до тех пор пока все не загрузится
        [Frame(factoryClass = "Loader")]
        public class Game extends Sprite {       
 
                // ТУТ РАЗНЫЕ СВОЙСТВА КЛАССА
 
                // CONSTRUCTOR
                public function Game():void {
                        if (stage) { init() } else { addEventListener(Event.ADDED_TO_STAGE, init) };
                }
 
                // INIT
                private function init(e:Event = null):void {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
 
                        // точка входа в игру
                };
 
                // ДАЛЬШЕ РАЗНЫЕ ФУНКЦИИ
};

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

Пожалуйста, помогите! Почему не работает прелоадер и как это исправить?

Добавлено через 29 минут
Всё, нашёл, кажется... Дело было в обращении к классу TF - внутри него была ссылка на шрифт, который входит в библиотеку. Видимо из-за обращения к элементу библиотеки она начинала грузиться полностью. Вставил индикацию через простое TextField и всё заработало.

Zebestov 14.06.2016 10:35

На всякий случай не делай больше такого определения загрузки. Все, что связано с checkFrame реализуй с помощью честного COMPLETE.

a7s1h1 14.06.2016 20:07

Цитата:

Сообщение от Zebestov (Сообщение 1194813)
На всякий случай не делай больше такого определения загрузки. Все, что связано с checkFrame реализуй с помощью честного COMPLETE.

Извиняюсь, не понял, о чём речь. Я использовал стандартный flashdevelopский прелоадер. Что в нём (или у меня) неправильно, поясните, пожалуйста

Zebestov 14.06.2016 20:54

Ну ты же используешь событие PROGRESS? Вот подпишись еще и на COMPLETE, чтобы определять, когда флешка загрузилась. Иногда bytesLoaded и(или) bytesTotal определяются некорректно, что приводит к "бесконечной загрузке". В свое время много игр на порталах так позависало.

a7s1h1 16.06.2016 01:05

Цитата:

Сообщение от Zebestov (Сообщение 1194840)
Ну ты же используешь событие PROGRESS? Вот подпишись еще и на COMPLETE, чтобы определять, когда флешка загрузилась. Иногда bytesLoaded и(или) bytesTotal определяются некорректно, что приводит к "бесконечной загрузке". В свое время много игр на порталах так позависало.

C таким подходом выходит, что ENTER-FRAME вообще не нужен?

Zebestov 16.06.2016 08:27

Цитата:

Сообщение от a7s1h1 (Сообщение 1194877)
C таким подходом выходит, что ENTER-FRAME вообще не нужен?

Здесь — похоже да, не нужен.

faraday 16.06.2016 12:39

Enter_frame тут нужен, по событию complete флешка находится еще в первом кадре, нужно дождаться ее перехода на второй.

Zebestov 16.06.2016 13:08

Обычно (если уж мы уходим от ENTER_FRAME) в конструкторе мы делаем stop(), а по COMPLETE — nextFrame().

faraday 16.06.2016 13:23

ну, в примере видимо расчет на то, что фрейм может быть не один)

Zebestov 16.06.2016 13:40

В классе-загрузчике обычно (всегда?) два фрейма. Сколько их в основном классе приложения не имеет значения.


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

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