Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Проблема с getdefinition (http://www.flasher.ru/forum/showthread.php?t=202542)

Nikto 22.07.2013 17:05

Проблема с getdefinition
 
Вообщем есть две флешки, первая загружает вторую. Во второй хранятся картинки, картинки вшиты во флешку через embed. Картинки из второй флешки в первую получаю через getDefinition.
Загружаю это всё на сервер. Включаю приложение, всё работает картинки передаются из второй флешки в первую, обновляю и после нефига ничё уже не работает.
Как мне быть? Читал в хелпе что чаще чем один раз getdefinition использовать нельзя, но ведь страница обновилась. Что за бред? Помогите, пожалуйста.

Nikto 22.07.2013 17:51

okouser, да я даже не знаю, что логить. Выкладывать слишком много.
Чистка кэша почему-то иногда помогает, а иногда нет,. то есть после чистки оно может работать, а может и нет, но однозначно помогает перезаливка приложения.

Nikto 22.07.2013 19:46

Дебаговый плеер выдаёт такую ошибку:
TypeError: Error #1009: Cannot access a property or method of a null object reference.
на строчке:
Код AS3:

m1[0] = new (Preloader.MenuChange.contentLoaderInfo.applicationDomain.getDefinition("Main_ChFon1") as Class)();

Как и предполагалось он не может получить доступ к нужному классу, но я не пойму что не так.

MenuChange это Loader который объявлен статически в классе Preloader. В этом же классе я гружу дополнительную swf, позже пытаюсь достать от туда картинку и получаю ошибку.

Nikto 22.07.2013 20:38

Флешка точно загрузилась, т.к. в прелоадере это проверяется.
Ставлю
Код AS3:

Security.allowDomain("*");

В Loader передаю такой LoaderContext
Код AS3:

var lc: LoaderContext = new LoaderContext();
      lc.securityDomain = SecurityDomain.currentDomain;

Вот весь код прелоадера:
Код AS3:

public class Preloader extends MovieClip 
        {
                private var z1: DisplayObject;
                private var z4: DisplayObject;
                private var z5: DisplayObject;
 
                public static const vstupr: String = "http://app.vk.com/c6121/u148888832/ec2e18914be11b.swf";
                public static const menuch: String = "http://app.vk.com/c6119/u148888832/8c54d02ce667d4.swf";
 
                public static var MenuChange: Loader;
                public static var VstupRolik: Loader;
 
                private var ml: int = 0;
                private var mt: int = 0;
                private var vl: int = 0;
                private var vt: int = 0;
 
                private var isdop: Boolean;
 
                public static var flashVars: Object;
 
                [Embed(source = "pictures/ZM/1Экран Фон.png")] public static var Zm1: Class;
                [Embed(source = "pictures/ZM/4Загрузка линии текст2.png")] public static var Zm4: Class;
                [Embed(source = "pictures/ZM/5Загрузка полная.png")] public static var Zm5: Class;
 
                public function Preloader()
                {                       
                        if (stage) {
                                stage.scaleMode = StageScaleMode.NO_SCALE;
                                stage.align = StageAlign.TOP_LEFT;
                        }
            flashVars = stage.loaderInfo.parameters as Object;
 
                        var obj: Object = JSON.parse(Preloader.flashVars.api_result);
                        if (int(obj.response.IsRegister) == 0) isdop = true else isdop = false;
                        if (isdop == true)
                        {
                                MenuChange = new Loader();
                                VstupRolik = new Loader();
                                Security.allowDomain("*");
                                var lc: LoaderContext = new LoaderContext();
                                lc.securityDomain = SecurityDomain.currentDomain;
                                //lc.applicationDomain = ApplicationDomain.currentDomain;
                                MenuChange.load(new URLRequest(menuch), lc);
                                VstupRolik.load(new URLRequest(vstupr));
 
                                MenuChange.addEventListener(ProgressEvent.PROGRESS, progressm);
                            VstupRolik.addEventListener(ProgressEvent.PROGRESS, progressv);
                        }
 
                        z1 = new Zm1();
                        z4 = new Zm4();
                        z5 = new Zm5();
 
                        z4.alpha = 0;
                        z5.alpha = 0;
 
                        addChild(z1);
                        addChild(z4);
                        addChild(z5);
 
                        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 progressm(e: ProgressEvent):void
                {
                                ml = e.bytesLoaded;
                                mt = e.bytesTotal;
                }
 
                private function progressv(e: ProgressEvent):void
                {
                                vl = e.bytesLoaded;
                                vt = e.bytesTotal;
                }
 
                private function progress(e:ProgressEvent):void
                {                       
                        // TODO update loader
                        if (((loaderInfo.bytesLoaded+ml+vl) / (loaderInfo.bytesTotal+mt+vt)) * 100 < 50)
                        {
                                z4.alpha = ((((loaderInfo.bytesLoaded+ml+vl) / (loaderInfo.bytesTotal+mt+vt)) * 100) * 2) / 100;
                        } else
                        {
                                                //if ((loaderInfo.bytesLoaded / loaderInfo.bytesTotal) * 100 < 66)
                                z5.alpha = ((((loaderInfo.bytesLoaded+ml+vl) / (loaderInfo.bytesTotal+mt+vt)) * 100 - 50) * 2) / 100;                       
                        }       
 
                }
 
                private function checkFrame(e:Event):void
                {
                        if ((currentFrame+ml+vl) == (totalFrames+mt+vt))
                        {
                                stop();
                                loadingFinished();
                        }
                }
 
                private function loadingFinished():void
                {
                        removeEventListener(Event.ENTER_FRAME, checkFrame);
                        loaderInfo.removeEventListener(ProgressEvent.PROGRESS, progress);
                        loaderInfo.removeEventListener(IOErrorEvent.IO_ERROR, ioError);
                        if (isdop == true)
                        {
                                MenuChange.removeEventListener(ProgressEvent.PROGRESS, progressm);
                                VstupRolik.removeEventListener(ProgressEvent.PROGRESS, progressv);
                        }
 
                        // TODO hide loader
 
                        removeChild(z1);
                        removeChild(z4);
                        removeChild(z5);
 
                        startup();
                }
 
                private function startup():void
                {
                        var mainClass:Class = getDefinitionByName("Main") as Class;
                        addChild(new mainClass() as DisplayObject);
                }
 
        }


Nikto 22.07.2013 21:45

Сам не особо это понял. Но такой код прелоадера сгенерировал мне flashdevelop. Вероятно когда всё загрузилось он как-то переходит к следующему кадру, вот он и проверяет последний кадр или нет.

Добавлено через 2 часа 34 минуты
Сделал так подписал все loader'ы на событие complete и завёл флаги для проверки на завершение загрузки. Проверял наличие флагов в enter_frame. И всё заработало.
okouser, спасибо, это вы навели меня на эту мысль.

Nikto 23.07.2013 01:41

Хорошо, спасибо, учту.
Хотя если это не эффективно, почему flashdevelop предлагает вариант preloader сделанный через ENTER_FRAME?


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

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