![]() |
|
||||||||||
|
|||||
|
Регистрация: Oct 2013
Сообщений: 126
|
Здравствуйте!
В сети нашёл огромное количество обсуждений данный проблемы, но ни одно из решений не помогло. Вы моя последняя надежда, выручайте, пожалуйста! Код пишу во FlashDevelop, графику импортирую его средствами через swc (галочка "Add to library"). Использую чуть модифицированную версию стандартного прелоадера FlashDevelop, который создаётся при выборе "AS3 Project with Preloader" при создании нового проекта. Вот код прелоадера: 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); } } } 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); // точка входа в игру }; // ДАЛЬШЕ РАЗНЫЕ ФУНКЦИИ }; Насколько я понимаю, проблема в том, что всё грузится до прелоадера, но почему это происходит, не пойму. Пожалуйста, помогите! Почему не работает прелоадер и как это исправить? Добавлено через 29 минут Всё, нашёл, кажется... Дело было в обращении к классу TF - внутри него была ссылка на шрифт, который входит в библиотеку. Видимо из-за обращения к элементу библиотеки она начинала грузиться полностью. Вставил индикацию через простое TextField и всё заработало. |
|
|||||
|
Lorem ipsum
|
На всякий случай не делай больше такого определения загрузки. Все, что связано с checkFrame реализуй с помощью честного COMPLETE.
__________________
Поймай яблоко 2! |
|
|||||
|
Регистрация: Oct 2013
Сообщений: 126
|
Извиняюсь, не понял, о чём речь. Я использовал стандартный flashdevelopский прелоадер. Что в нём (или у меня) неправильно, поясните, пожалуйста
|
|
|||||
|
Lorem ipsum
|
Ну ты же используешь событие PROGRESS? Вот подпишись еще и на COMPLETE, чтобы определять, когда флешка загрузилась. Иногда bytesLoaded и(или) bytesTotal определяются некорректно, что приводит к "бесконечной загрузке". В свое время много игр на порталах так позависало.
__________________
Поймай яблоко 2! |
|
|||||
|
Регистрация: Oct 2013
Сообщений: 126
|
C таким подходом выходит, что ENTER-FRAME вообще не нужен?
|
|
|||||
|
Lorem ipsum
|
Здесь — похоже да, не нужен.
__________________
Поймай яблоко 2! |
|
|||||
|
Регистрация: Apr 2009
Сообщений: 409
|
Enter_frame тут нужен, по событию complete флешка находится еще в первом кадре, нужно дождаться ее перехода на второй.
|
|
|||||
|
Lorem ipsum
|
Обычно (если уж мы уходим от ENTER_FRAME) в конструкторе мы делаем stop(), а по COMPLETE — nextFrame().
__________________
Поймай яблоко 2! |
|
|||||
|
Регистрация: Apr 2009
Сообщений: 409
|
ну, в примере видимо расчет на то, что фрейм может быть не один)
|
|
|||||
|
Lorem ipsum
|
В классе-загрузчике обычно (всегда?) два фрейма. Сколько их в основном классе приложения не имеет значения.
__________________
Поймай яблоко 2! |
![]() |
![]() |
Часовой пояс GMT +4, время: 02:38. |
|
|
« Предыдущая тема | Следующая тема » |
|
|