Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 08.09.2010, 11:09
gloomyBrain вне форума Посмотреть профиль Отправить личное сообщение для gloomyBrain Найти все сообщения от gloomyBrain
  № 1  
Ответить с цитированием
gloomyBrain
 
Аватар для gloomyBrain

блогер
Регистрация: Mar 2008
Адрес: РФ, Санкт-Петербург
Сообщений: 2,272
Записей в блоге: 5
Отправить сообщение для gloomyBrain с помощью ICQ Отправить сообщение для gloomyBrain с помощью Skype™
Cool 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
__________________
...вселенская грусть


Последний раз редактировалось gloomyBrain; 08.09.2010 в 12:01.
Старый 08.09.2010, 12:21
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 2  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,784
Значит игра плохо выгружается, если остается Game в домене.

Старый 08.09.2010, 12:37
gloomyBrain вне форума Посмотреть профиль Отправить личное сообщение для gloomyBrain Найти все сообщения от gloomyBrain
  № 3  
Ответить с цитированием
gloomyBrain
 
Аватар для gloomyBrain

блогер
Регистрация: Mar 2008
Адрес: РФ, Санкт-Петербург
Сообщений: 2,272
Записей в блоге: 5
Отправить сообщение для gloomyBrain с помощью ICQ Отправить сообщение для gloomyBrain с помощью Skype™
А как лучше выгрузить?
Тупо unload? Просто у меня была мысль завести отдельный домен и каждый раз грузить в него. Чтобы обращаться не loader.contentLoaderInfo.applicationDomain, а просто myCustomDomain.
Но почему-то через loader дефинишн есть, а через customDomain - нет =)
Может я чего-то не так понял из доков
__________________
...вселенская грусть

Старый 08.09.2010, 12:48
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 4  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,784
Домен должен быть дочерним к текущему, хотя бы.
unload да, и все ссылки поубивать.

Старый 08.09.2010, 12:56
gloomyBrain вне форума Посмотреть профиль Отправить личное сообщение для gloomyBrain Найти все сообщения от gloomyBrain
  № 5  
Ответить с цитированием
gloomyBrain
 
Аватар для gloomyBrain

блогер
Регистрация: Mar 2008
Адрес: РФ, Санкт-Петербург
Сообщений: 2,272
Записей в блоге: 5
Отправить сообщение для gloomyBrain с помощью ICQ Отправить сообщение для gloomyBrain с помощью Skype™
Цитата:
unload да, и все ссылки поубивать.
Ну да, так и есть.
Только как быть с доменом? Я гружу в кастомный домен, который дочерний к текущему домену приложения. Затем тем же лоадером гружу в еще один домен, который тоже дочерний к текущему.
По окончании загрузки всего - loader.unload
После этого, мне по идее, нужно только убить ссылки на домены (создать новые домены по тем же ссылкам) и на экземпляры классов из доменов.
После этого можно грузить заново классы с такими же именами?
__________________
...вселенская грусть

Старый 08.09.2010, 13:19
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 6  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

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

Старый 08.09.2010, 13:33
gloomyBrain вне форума Посмотреть профиль Отправить личное сообщение для gloomyBrain Найти все сообщения от gloomyBrain
  № 7  
Ответить с цитированием
gloomyBrain
 
Аватар для gloomyBrain

блогер
Регистрация: Mar 2008
Адрес: РФ, Санкт-Петербург
Сообщений: 2,272
Записей в блоге: 5
Отправить сообщение для gloomyBrain с помощью ICQ Отправить сообщение для gloomyBrain с помощью Skype™
Ага, то есть получается, что swf-ка намертво привязана к loader'у
Я полагал, что она лежит в домене, а loader просто имеет на нее ссылку
Спасибо, вроде разобрался.
__________________
...вселенская грусть

Старый 08.09.2010, 13:39
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 8  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,784
Лоадер можно пересоздавать, а домен постоянный. Это не принципиально, можно все пересоздавать.

Старый 08.09.2010, 14:20
gloomyBrain вне форума Посмотреть профиль Отправить личное сообщение для gloomyBrain Найти все сообщения от gloomyBrain
  № 9  
Ответить с цитированием
gloomyBrain
 
Аватар для gloomyBrain

блогер
Регистрация: Mar 2008
Адрес: РФ, Санкт-Петербург
Сообщений: 2,272
Записей в блоге: 5
Отправить сообщение для gloomyBrain с помощью ICQ Отправить сообщение для gloomyBrain с помощью Skype™
Код 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
Все таки не разобрался - почему так?
И почему оно не кастуется в интерфейс зашитый в оба файла?
__________________
...вселенская грусть


Последний раз редактировалось gloomyBrain; 08.09.2010 в 14:54.
Старый 08.09.2010, 14:29
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 10  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,784
Меня первая строчка смущает.

Создать новую тему Ответ Часовой пояс GMT +4, время: 18:01.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Теги
applicationDomain , interface , loader as3

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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