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

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

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

Регистрация: Jan 2008
Сообщений: 35
По умолчанию Скопировать LoaderInfo

Здравствуйте.

В моем проекте требуется загружать много файлов, я делаю это с помощью класса Loader. Я сделал 2 режима загрузки: последовательный и параллельный.

При последовательной загрузке, решил я, не нужно много загрузчиков, можно после загрузки каждого файла помещать его в специальный массив, и загружать следующий файл тем же загрузчиком, что и попытался сделать. Добавление загруженных данных в массив выглядит следующим образом:


Код AS3:
contents[ev.target.loader.number] = ev.target
отмечу, что не использую функцию push, а записываю данные в ячейку по номеру потому, что при параллельной загрузке файлы могут перепутаться, если, например, 2-й будет меньшего размера, чем 1-й.

В массив, соответственно, добавляется не само содержимое, а ссылка на объект LoaderInfo загрузчика, т.к., кроме картинок я загружаю еще и другую флешку, из которой затем извлекаю классы через applicationDomain.

И тут я столкнулся с закономерной проблемой: поскольку в массиве хранится именно ссылка, а не сам объект, при загрузке нового файла, к старому обратиться уже не получится.

Подскажите, можно ли как-нибудь скопировать LoaderInfo загрузчика, чтобы при загрузке следующего файла сохраненная ссылка оставалась действительной?
Пробовал полное копирование объекта в виде

Код AS3:
contents[ev.target.loader.number] = clone(ev.target)
или даже

Код AS3:
contents[ev.target.loader.number] = clone(ev.target) as LoaderInfo
не помогло, при загрузке флешки выдается ошибка

Код:
TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".
пробовал также использовать статический метод LoaderInfo.getLoaderInfoByDefinition, однако и это не дало результатов. Попытка сделать так:

Код AS3:
contents[ev.target.loader.number] = LoaderInfo.getLoaderInfoByDefinition(ev.target.content);
выдает ошибку

Код:
ReferenceError: Error #1065: Переменная MainLoader не определена.
	at flash.system::ApplicationDomain/getDefinition()
MainLoader - это класс в загруженной флешке.

Есть, конечно, простой вариант - использовать много загрузчиков для множества файлов и при последовательной загрузке, но он кажется мне неправильным, ведь в каждый момент времени всё= будет использоваться только 1.

Старый 11.10.2010, 19:52
iCluster вне форума Посмотреть профиль Отправить личное сообщение для iCluster Найти все сообщения от iCluster
  № 2  
Ответить с цитированием
iCluster

Регистрация: Oct 2010
Адрес: PNZ
Сообщений: 20
Хм... а почему бы не создавать каждый раз новый объект и записывать уже его в массив?
допустим:
Код AS3:
var content: DisplayObject = Loader(ev.target).content;
contents[ev.target.loader.number] = content;


Последний раз редактировалось iCluster; 11.10.2010 в 21:30.
Старый 11.10.2010, 21:45
iforev вне форума Посмотреть профиль Отправить личное сообщение для iforev Найти все сообщения от iforev
  № 3  
Ответить с цитированием
iforev

Регистрация: Jan 2008
Сообщений: 35
Пробовал по-разному, всё никак. Например, Ваш пример выдает

Код:
TypeError: Error #1034: Ошибка типа Coercion: невозможно преобразовать flash.display::LoaderInfo@292860d1 в flash.display.Loader.
либо, если написать

Код AS3:
var content: DisplayObject = Loader(ev.target.content)
contents[ev.target.loader.number] = content
то ошибка будет

Код:
TypeError: Error #1034: Ошибка типа Coercion: невозможно преобразовать busy@2ab040f9 в flash.display.Loader.
что есть busy, откуда он берется и как с ним бороться (я так понимаю, подразумевается, что объект кем-то занят) - еще 1 вопрос

Старый 11.10.2010, 21:48
iCluster вне форума Посмотреть профиль Отправить личное сообщение для iCluster Найти все сообщения от iCluster
  № 4  
Ответить с цитированием
iCluster

Регистрация: Oct 2010
Адрес: PNZ
Сообщений: 20
Ну конечно же! Садовая моя голова событие то отсылает loaderInfo... так что код должен быть -
Код AS3:
var content: DisplayObject = LoaderInfo(ev.target).content;
contents[ev.target.loader.number] = content;

Старый 11.10.2010, 22:29
iforev вне форума Посмотреть профиль Отправить личное сообщение для iforev Найти все сообщения от iforev
  № 5  
Ответить с цитированием
iforev

Регистрация: Jan 2008
Сообщений: 35
Благодарю, но тоже не совсем то, что хотелось бы. Здесь ведь флешка загружается и из нее нужно извлечь классы, что делается через LoaderInfo -> ApplicationDomain, т.е. в массиве нужно хранить не content, а сам LoaderInfo. Попытка получить свойство loaderInfo контента, вот такая:

Код AS3:
LoaderInfo.getLoaderInfoByDefinition(firstLoader.contents[0]).applicationDomain.getDefinition(xml.service.classes.children()[i])
натыкается на следующую ошибку:

Код:
ReferenceError: Error #1065: Переменная MainLoader не определена.
если писать

Код AS3:
var content: LoaderInfo = LoaderInfo(ev.target)
contents[ev.target.loader.number] = content;
результат тот же.

Старый 11.10.2010, 23:20
iCluster вне форума Посмотреть профиль Отправить личное сообщение для iCluster Найти все сообщения от iCluster
  № 6  
Ответить с цитированием
iCluster

Регистрация: Oct 2010
Адрес: PNZ
Сообщений: 20
Могу порекомендовать на сайте адоба посмотреть описание ApplicationDomain, там внизу есть пример - как раз под ваш случай Т.е. не использовать один Loader для всех файлов, а для каждого создать отдельный класс - и по требованию дергать нужный класс из загруженного объекта.
Ну или попробовать записывать в массив объекты, возвращаемые методом contentLoaderInfo класса Loader.

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

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Цитата:
Сообщение от iforev Посмотреть сообщение
... из нее нужно извлечь классы, что делается через LoaderInfo -> ApplicationDomain, т.е. в массиве нужно хранить не content, а сам LoaderInfo.
Т.е. нужно хранить ссылки на только ApplicationDomain.
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

Старый 12.10.2010, 13:58
iforev вне форума Посмотреть профиль Отправить личное сообщение для iforev Найти все сообщения от iforev
  № 8  
Ответить с цитированием
iforev

Регистрация: Jan 2008
Сообщений: 35
Я этим загрузчиком загружаю еще и картинки.
Попробую флешку грузить отдельным классом, а картинки - по методу, предложенному в сообщении №4

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

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Loader - это транспортный уровень. Что он загрузит для уровня стоящего над ним, так и будет трактоваться. Если транспорт доставил для объекта Image картинку, то в Image знают, что c ней делать. А ResourceManager'у от лоадера будет нужен только ApplicationDomain из его LoaderInfo.
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

Старый 12.10.2010, 15:42
iforev вне форума Посмотреть профиль Отправить личное сообщение для iforev Найти все сообщения от iforev
  № 10  
Ответить с цитированием
iforev

Регистрация: Jan 2008
Сообщений: 35
См. мое сообщение под номером 5 в этой теме. Я хотел использовать свой класс, внутри которого есть Лоадеры, для загрузки разных типов файлов, помещая загруженное в массив contents этого класса, откуда его потом можно было бы забирать. Но от флешки мне нужны были встроенные классы, а извлечь их, загружая ее таким путем, не удалось

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

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

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


 


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


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