Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Ошибка 1009 при подгрузке SWF (http://www.flasher.ru/forum/showthread.php?t=202795)

alexqw 11.08.2013 19:17

Ошибка 1009 при подгрузке SWF
 
Подскажите в чём может быть проблема?
Есть такой прелоадер:

Код AS3:

package
{
        import flash.display.DisplayObject;
        import flash.display.Loader;
        import flash.display.MovieClip;
        import flash.events.Event;
        import flash.events.ProgressEvent;
        import flash.net.LocalConnection;
        import flash.net.URLRequest;
        import flash.system.ApplicationDomain;
        import flash.system.LoaderContext;
        import flash.system.Security;
        import flash.system.SecurityDomain;
 
        public class Preload extends MovieClip
        {
                public function Preload()
                {
 
                        this.addEventListener(Event.ADDED_TO_STAGE, onStage);
 
                        function onStage(e:Event) {
                        var preloader:Loader = new Loader();
                        var request:URLRequest = new URLRequest('game.swf');
                        preloader.contentLoaderInfo.addEventListener(Event.COMPLETE, onccCompl);
                        preloader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgr);
                        preloader.load(request);       
                        }
                }
 
                private function onProgr(e:ProgressEvent) {
                        var bLoad:int = e.bytesLoaded;
                        var bTotal:int = e.bytesTotal;
                        textWin.text = String(bLoad/bTotal*100);
                }
                private function onccCompl(e:Event) {
                        trace('ok');
                        var mc:MovieClip=e.target.content as MovieClip;
                        addChild(mc);
                }
        }
}


Проценты бегут, но при завершении флешка не добавляется на сцену.
Пробовал и SecurityDomain и по ADDED_TO_STAGE. Вылетает ошибка:
TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".
at Game()

mikhailk 11.08.2013 19:40

Цитата:

TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".
at Game()
Ошибка возникает в классе Game.
Туда и надо смотреть.

alexqw 11.08.2013 19:51

Без прелоадера работает.
Может что-то с FlashVars?

belv 11.08.2013 20:08

А Вы там к stage не обращаетесь?

mikhailk 11.08.2013 21:15

Цитата:

Без прелоадера работает.
Может что-то с FlashVars?
А при компиляции разве не указывается, в какой строке ошибка?
Покажите код Game.

alexqw 11.08.2013 21:19

Цитата:

Сообщение от belv (Сообщение 1143446)
А Вы там к stage не обращаетесь?

Обращаюсь.

belv 11.08.2013 22:18

Ну вот Вам и ошибка, потому что, когда Вы загружаете 1 swf во 2, в загружаемом нет свойства stage.Можно будет обратится к stage, когда она будет уже добавлена в список отображения.Я думаю, что именно по этой причине во flash develop по умолчанию создается такая структура.
Код AS3:

        public function Main():void 
                {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(e:Event = null):void
                {
        removeEventListener(Event.ADDED_TO_STAGE, init);
                        // тут начинается выполнение программы, а не а конструкторе.
                }

Может я и ошибаюсь, на мой взгляд самое логичное объяснение.

mikhailk 12.08.2013 01:11

На самом деле, путаница в обработке событий.
Автор кода думает, что e.target в функции onccCompl это loader, но на самом деле это loader.contentLoaderInfo (см. на подписку на событие Event.COMPLETE).

Самое простое - вынести лоадер в приватные переменные класса и брать контент из него.

belv 12.08.2013 01:35

Вы попробуйте загрузить так как автор и Вы увидите, что все работает.
А ошибку генерирует загружаемая флешка.Компилятор говорит, что нет какого-то свойства.Это свойство stage, я больше чем уверен.
Попробуйте в загружаемую swf прописать, trace(stage.stageWidth); и Вы увидите эту же ошибку.

alexqw 12.08.2013 11:14

Цитата:

Сообщение от belv (Сообщение 1143460)
Ну вот Вам и ошибка, потому что, когда Вы загружаете 1 swf во 2, в загружаемом нет свойства stage.Можно будет обратится к stage, когда она будет уже добавлена в список отображения.Я думаю, что именно по этой причине во flash develop по умолчанию создается такая структура.
Код AS3:

        public function Main():void 
                {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(e:Event = null):void
                {
        removeEventListener(Event.ADDED_TO_STAGE, init);
                        // тут начинается выполнение программы, а не а конструкторе.
                }

Может я и ошибаюсь, на мой взгляд самое логичное объяснение.



Спасибо большое!!!
Так работает.

mikhailk 12.08.2013 11:28

Цитата:

Вы попробуйте загрузить так как автор и Вы увидите, что все работает.
Да? Ну ладно, значит ошибся.
Но все равно не понятно, зачем автор сделал прелоадер таким странным способом, когда уже давно есть каноническое решение на этот счет.

Собственно, при создании проекта в FD темплейт так и называется "...с прелоадером".

belv 12.08.2013 12:05

Цитата:

Но все равно не понятно, зачем автор сделал прелоадер таким странным способом
Потому что окончание загрузки и прогресс загрузки, можно получить через contentLoaderInfo.

KumoKairo 12.08.2013 12:20

Цитата:

Собственно, при создании проекта в FD темплейт так и называется "...с прелоадером".
Кстати если разобрать этот темплейт - там пара ненужных вещей вроде использования getDefinitionByName() и проверки общего количества кадров в ентерфрейме

mikhailk 13.08.2013 15:10

Цитата:

Кстати если разобрать этот темплейт - там пара ненужных вещей вроде использования getDefinitionByName() и проверки общего количества кадров в ентерфрейме
В рамках этого темплейта можно сделать единый прелоадер как на загрузку основного swf, так и на подгрузку ресурсов. Решение ТС этого сделать не позволяет. Мне кажется, уже этого достаточно, чтобы отказаться от данного кустарного способа.

belv 13.08.2013 16:07

Да не кустарный это способ, а взят от сюда.
http://help.adobe.com/ru_RU/FlashPla...tentLoaderInfo

mikhailk 13.08.2013 18:53

"Кустарность" относилась не к загрузке swf-контента вообще, а к загрузке приложения на старте. Но спорить смысла не вижу.

Обычно такие прелоадеры (как у ТС) ставят, когда сначала приложение весило 100к, потом 200к, а потом неожиданно вырастает под метр и пустой экран начинает напрягать. И вот тогда все вспоминают про прелоадер.

belv 13.08.2013 18:58

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


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

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