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

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

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

Регистрация: Nov 2010
Адрес: Москва
Сообщений: 915
Записей в блоге: 4
Отправить сообщение для Aquahawk с помощью ICQ Отправить сообщение для Aquahawk с помощью Skype™
По умолчанию ProgressEvent.PROGRESS не приходит в подгружаемой swf.

Гружу в свою флешку чужую. В ней *****код который вешает на loaderInfo обработчик ProgressEvent.PROGRESS и если bytesLoaded==bytesTotal прекращает отрисовку загрузчика и запускает основное содержимое. Ни init ни complete не обрабатываются. При запуске отдельно или на веб странице PROGRESS при ходит как минимум дважды(выяснено опытным путём) один в начале загрузки с bytesLoaded==0 и второй с bytesLoaded==bytesTotal. А если я подгружаю эту то ни один прогресс не приходит.

Для прояснения написал 2 простейших примера: as3Loader и as3EventCollector Коллектор собирает всякие интересные ивенты и трейсит их, лоадер подгружает коллектор и тоже трейсит свои ивенты. Вот они:
При загрузке отдельно:
Код:
!ToLoad cinit
!ToLoad iinit
!ToLoad  [Event type="added" bubbles=true cancelable=false eventPhase=2] Target = [object Main] CurrentTarget [object Main]
!ToLoad  [Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] Target = [object Main] CurrentTarget [object Main]
!ToLoad  [Event type="init" bubbles=false cancelable=false eventPhase=2] Target = [object LoaderInfo] CurrentTarget [object LoaderInfo]
!ToLoad  [ProgressEvent type="progress" bubbles=false cancelable=false eventPhase=2 bytesLoaded=1161 bytesTotal=1161] Target = [object LoaderInfo] CurrentTarget [object LoaderInfo]
!ToLoad  [Event type="complete" bubbles=false cancelable=false eventPhase=2] Target = [object LoaderInfo] CurrentTarget [object LoaderInfo]
!ToLoad  [Event type="activate" bubbles=false cancelable=false eventPhase=2] Target = [object Main] CurrentTarget [object Main]
При загрузке через лоадер:
Код:
Loader  [Event type="added" bubbles=true cancelable=false eventPhase=2] Target = [object Loader] CurrentTarget [object Loader]
Loader  [Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] Target = [object Loader] CurrentTarget [object Loader]
Loader  [ProgressEvent type="progress" bubbles=false cancelable=false eventPhase=2 bytesLoaded=0 bytesTotal=1164] Target = [object LoaderInfo] CurrentTarget [object LoaderInfo]
Loader  [ProgressEvent type="progress" bubbles=false cancelable=false eventPhase=2 bytesLoaded=1164 bytesTotal=1164] Target = [object LoaderInfo] CurrentTarget [object LoaderInfo]
!ToLoad cinit
!ToLoad iinit
!ToLoad  [Event type="added" bubbles=true cancelable=false eventPhase=2] Target = [object Main] CurrentTarget [object Main]
!ToLoad  [Event type="added" bubbles=true cancelable=false eventPhase=2] Target = [object Main] CurrentTarget [object Main]
Loader  [Event type="added" bubbles=true cancelable=false eventPhase=3] Target = [object Main] CurrentTarget [object Loader]
!ToLoad  [Event type="addedToStage" bubbles=false cancelable=false eventPhase=2] Target = [object Main] CurrentTarget [object Main]
Loader  [Event type="init" bubbles=false cancelable=false eventPhase=2] Target = [object LoaderInfo] CurrentTarget [object LoaderInfo]
!ToLoad  [Event type="init" bubbles=false cancelable=false eventPhase=2] Target = [object LoaderInfo] CurrentTarget [object LoaderInfo]
Loader  [Event type="complete" bubbles=false cancelable=false eventPhase=2] Target = [object LoaderInfo] CurrentTarget [object LoaderInfo]
!ToLoad  [Event type="complete" bubbles=false cancelable=false eventPhase=2] Target = [object LoaderInfo] CurrentTarget [object LoaderInfo]
В результате мы видим что PROGRESS прошёл раньше чем произошла инициализация класса DocumentClass. В результате чего зарегистрировать прогресс внутри не представляется возможным. Всякие разные ухищрения испробовал, не помогает. Диспатчить ивенты в LoaderInfo запрещено. Подменить его тоже не получилось. Есть идеи как такое сделать? Дело осложняется тем что я гружу другую флешку скачала как байтаррай а потом уже лоадером загружаю через loadBytes(). Единственная мысль которая пришла в момент написания поста это модифицировать загружаемую флешку примерно так. Чтобы загрузка продолжилась после init. Сейчас буду это дело ковырять.

Добавлено через 22 минуты
Сделал тестовый прелоадер с экспортом всего остального во второй кадр, не помогло, даже он грузится так что прогресс приходит раньше инита. Даже затолкал в третий кадр трёхметровый jpg, всё равно сначала всё загрузил потом запустил(что с локалки что с сервера).


Последний раз редактировалось Aquahawk; 21.01.2011 в 18:20.
Старый 21.01.2011, 17:52
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 2  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Просто мысль вслух: а что будет если создать всплывающее событие "progress" и запустить его когда нужно?
EDIT: Ой, сам спросил, сам ответил Его же LoaderInfo передает -> не получится...
__________________
Hell is the possibility of sanity

Старый 21.01.2011, 17:55
Aquahawk вне форума Посмотреть профиль Отправить личное сообщение для Aquahawk Посетить домашнюю страницу Aquahawk Найти все сообщения от Aquahawk
  № 3  
Ответить с цитированием
Aquahawk
 
Аватар для Aquahawk

Регистрация: Nov 2010
Адрес: Москва
Сообщений: 915
Записей в блоге: 4
Отправить сообщение для Aquahawk с помощью ICQ Отправить сообщение для Aquahawk с помощью Skype™
Я бы с радостью, но для получения прогресса делают loaderInfo.addEventListener(ProgressEvent.PROGRESS, handler); События там свои и вызов loaderInfo.dispatchEvent явно вызывает ошибку, это можно увидеть декомпильнув playerglobal.swc.

Старый 21.01.2011, 18:00
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 4  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Если загружаемая флешка наследуется от MovieClip - можно попробовать addFrameScript и из функции добавленой таким образом вызвать обработчик, в кототом обрабатывается "progress"... или... дописать еще одну функцию в класс перед загрузкой... или, если возможно грузить в тот же домейн, то подготовить в "своем" домейне класс с таким же названием, как и у загружаемого документ класса... но тут могут быть проблемы с линкованием к символам...
__________________
Hell is the possibility of sanity

Старый 21.01.2011, 18:15
Aquahawk вне форума Посмотреть профиль Отправить личное сообщение для Aquahawk Посетить домашнюю страницу Aquahawk Найти все сообщения от Aquahawk
  № 5  
Ответить с цитированием
Aquahawk
 
Аватар для Aquahawk

Регистрация: Nov 2010
Адрес: Москва
Сообщений: 915
Записей в блоге: 4
Отправить сообщение для Aquahawk с помощью ICQ Отправить сообщение для Aquahawk с помощью Skype™
Цитата:
Сообщение от wvxvw Посмотреть сообщение
Если загружаемая флешка наследуется от MovieClip - можно попробовать addFrameScript и из функции добавленой таким образом вызвать обработчик, в кототом обрабатывается "progress"... или... дописать еще одну функцию в класс перед загрузкой... или, если возможно грузить в тот же домейн, то подготовить в "своем" домейне класс с таким же названием, как и у загружаемого документ класса... но тут могут быть проблемы с линкованием к символам...
Для начала я не знаю какая функция подписывается на progress(если декомпильнуть и посмотреть то знаю, мне нужно в автоматическом режиме сделать это.) Своя функция не проблема но особо тодже не поможет. Класс с таким названием делать нельзя т.к. флешка подгрузившись работать не будет.

Есть вариант в constentPool преписать мультинейм от addEventListener на например customAddeventListener,настоящий addEventListener записать в конец со своим номером , через prototype подсунуть в loaderInfo такую функцию, внутри неё собрать обработчик прогресса и вызвать настояший addEventListener. Потом имея указатель на функцию создать progress самостоятельно и вызвать обработчик. Это решение мне не нравится т.к. оно очень геморное, и ещё тем что если у каких-то других объектов есть(а он есть) addEventListener то они все будут ходить по другому мультинейму, и всё развалится. Ещё можно просто на ходу дизассемблировать все методы, найти кто вешает ивет лисенера на прогресс на лоадеринфо, и только там подменить на свой кастомный метод, но это ну оооочень сложно, с учётом того что все джампы в байткоде относительные и вписывание своего мультинейма приведёт к изменению размеров кода и необходимости пересчитать все смещения в рамках метода.

Старый 21.01.2011, 20:25
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 6  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
За те же деньги можно нанять киллеров из Албании и с особым зверством убить автора подгружаемой флешки... Я это к тому что... а может легче найти автора и заставить его переделать? Пытаться застраховаться от чужих ошибок - дело долгое, неблагодарное, и все равно не получится в итоге

Добавлено через 5 минут
Да, на сколько я понимаю, когда функция доходит до кноца, то стак должен быть пустым, ну, или уже все равно никому не важно, что там есть. Ну вот если реально найти того, кто подписался, то его прямо в той же функции (в конце) можно и отписать, и переподписать на что-то свое. Думаю, что если найти подписку будет возможно, то уже добавить код, который вообще никак не изменяется и не зависит от контекста будет не сложно.
__________________
Hell is the possibility of sanity

Старый 21.01.2011, 21:50
Aquahawk вне форума Посмотреть профиль Отправить личное сообщение для Aquahawk Посетить домашнюю страницу Aquahawk Найти все сообщения от Aquahawk
  № 7  
Ответить с цитированием
Aquahawk
 
Аватар для Aquahawk

Регистрация: Nov 2010
Адрес: Москва
Сообщений: 915
Записей в блоге: 4
Отправить сообщение для Aquahawk с помощью ICQ Отправить сообщение для Aquahawk с помощью Skype™
Искать автора и переделывать нет смысла т.к. я сам быстро могу переделать. Нужно именно в автоматическом режиме сделать, уже много что сделал, мелочи остались типа этой.
Отписывать нет нужды т.к. всё равно не придёт. Конец функции не обязательно исполняется. После return или returnvoid исполнение прекращается, т.е. функция может выйти в середине, проверял. Потому в конце нельзя. Можно попробовать в начале подписать, там ничего не съедет, адресация вся относительная. Дальше нужный ивент сфабриковать и подсунуть не проблема. Пока решили развивать проект дальше а таких товарищей патчить ручками. Я пока только одну такую флешку видел. Хотя если у кого ещё идеи будут с удовольствием выслушаю.

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

Теги
loader , loaderInfo , PROGRESS , ProgressEvent
Опции темы
Опции просмотра

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

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


 


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


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