Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   ApplicationDomain и интерфейсы (http://www.flasher.ru/forum/showthread.php?t=144282)

gloomyBrain 08.09.2010 11:09

ApplicationDomain и интерфейсы
 
Всем привет
Суть ситуации вот в чем:
- Есть swf-контейнер для нескольких игр
- Есть несколько swf-файлов, в которых зашиты несколько вариантов логики игры (класс Game, называется так во всех swf-ках).
- Далее, есть интерфейс IGame, который зашит во все swf-ки, включая контейнер.

Идея такая, что swf-загрузчик обращается к логике любой игры через IGame.
Но...
Так как имена классов совпадают (логика везде называется Game), то во избежание повторения имен классов, я каждый раз swf с классом Game гружу в новый ApplicationDomain.

И вот в чем весь косяк - интерфейс IGame в загружаемой swf-ке тоже попадает в новый ApplicationDomain, а значит, он уже не равен интерфейсу в swf-ке загрузчике.
Соответственно, кастинг Game из загруженной swf-ки в IGame загружающей возвращает ровно null =(

Уфф... ну вот, наконец-то, и сам вопрос - как лучше с этим разобраться, при учете, что необходимо сохранить имя класса Game во всех swf-ках?

UPD:
Судя по всему, нужного эффекта никак не добиться. По сути, мне нужно было перезаписать класс Game в текущем домене приложения, чего сделать никак нельзя.
Единственный выход для сохранения строгой типизации - это изменение имен классов в загружаемых swf-ках и загрузка этих swf-ок в ApplicationDomain.currentDomain

etc 08.09.2010 12:21

Значит игра плохо выгружается, если остается Game в домене.

gloomyBrain 08.09.2010 12:37

А как лучше выгрузить?
Тупо unload? Просто у меня была мысль завести отдельный домен и каждый раз грузить в него. Чтобы обращаться не loader.contentLoaderInfo.applicationDomain, а просто myCustomDomain.
Но почему-то через loader дефинишн есть, а через customDomain - нет =)
Может я чего-то не так понял из доков

etc 08.09.2010 12:48

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

gloomyBrain 08.09.2010 12:56

Цитата:

unload да, и все ссылки поубивать.
Ну да, так и есть.
Только как быть с доменом? Я гружу в кастомный домен, который дочерний к текущему домену приложения. Затем тем же лоадером гружу в еще один домен, который тоже дочерний к текущему.
По окончании загрузки всего - loader.unload
После этого, мне по идее, нужно только убить ссылки на домены (создать новые домены по тем же ссылкам) и на экземпляры классов из доменов.
После этого можно грузить заново классы с такими же именами?

etc 08.09.2010 13:19

Надо грузить всегда в один и тот же домен (дочерний), не пересоздавая. Ссылок на классы из домена при выгрузке быть не должно. В консоли как минимум должен появится [Unload SWF], если всё прошло удачно.

gloomyBrain 08.09.2010 13:33

Ага, то есть получается, что swf-ка намертво привязана к loader'у
Я полагал, что она лежит в домене, а loader просто имеет на нее ссылку
Спасибо, вроде разобрался.

etc 08.09.2010 13:39

Лоадер можно пересоздавать, а домен постоянный. Это не принципиально, можно все пересоздавать.

gloomyBrain 08.09.2010 14:20

Код AS3:

var domain:ApplicationDomain = new ApplicationDomain(ApplicationDomain.currentDomain);
var loader:Loader = new Loader();
var context:LoaderContext = new LoaderContext(true, domain);
// грузим...
 
loader.contentLoaderInfo.applicationDomain.hasDefinition("Game")
// выводит true
 
domain.hasDefinition("Game")
// выводит false

Все таки не разобрался - почему так?
И почему оно не кастуется в интерфейс зашитый в оба файла?

etc 08.09.2010 14:29

Меня первая строчка смущает.

gloomyBrain 08.09.2010 14:41

там должно быть ApplicationDomain.currentDomain =)
недописал

Однако, сути вопроса это не меняет

etc 08.09.2010 14:57

У меня работает так:
Код AS3:

package {
        import flash.display.Loader;
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.net.URLRequest;
        import flash.system.ApplicationDomain;
        import flash.system.LoaderContext;
        import flash.utils.setTimeout;
 
        /**
        * @author                                        etc
        * @version                                        1.0
        * @playerversion                        Flash 10
        * @langversion                                3.0
        */

        public class GameLoader extends Sprite {
 
                public function GameLoader() {
                        super();
                        this._loader = new Loader();
                        this._domain = new ApplicationDomain(ApplicationDomain.currentDomain);
                        this._loader.contentLoaderInfo.addEventListener(Event.COMPLETE, this.handler_complete);
                        this._loader.load(new URLRequest('Game.swf'), new LoaderContext(false, this._domain));
                }
 
                /**
                * @private
                */

                private var _loader:Loader;
 
                /**
                * @private
                */

                private var _domain:ApplicationDomain;
 
                /**
                * @private
                */

                private function handler_complete(event:Event):void {
                        this._loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, this.handler_complete);
                        trace(this._loader.content is IGame); // true
                }
 
                /**
                * @private
                */

                private function unload():void {
                        this._domain = null;
                        this._loader.unloadAndStop(true);
                        this._loader = null;
                }
        }
}

Единственное что из домена Game не пропадает, поэтому его занулять приходится, хотя помнится при такой же схеме у нас пропадал. Можно попробовать грузить в текущий.

gloomyBrain 08.09.2010 15:29

Все кастуется на самом деле и удаляется с использованием указанного Вами подхода.
У меня не кастовалось в среде разработки, очевидно из-за securityDomain (потому что больше я причин не вижу, в браузере все работает и трейсит true, а в FD говорит false и ломается)

Еще раз спасибо


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

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