|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
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] Добавлено через 22 минуты Сделал тестовый прелоадер с экспортом всего остального во второй кадр, не помогло, даже он грузится так что прогресс приходит раньше инита. Даже затолкал в третий кадр трёхметровый jpg, всё равно сначала всё загрузил потом запустил(что с локалки что с сервера). Последний раз редактировалось Aquahawk; 21.01.2011 в 18:20. |
|
|||||
Modus ponens
|
Просто мысль вслух: а что будет если создать всплывающее событие "progress" и запустить его когда нужно?
EDIT: Ой, сам спросил, сам ответил Его же LoaderInfo передает -> не получится...
__________________
Hell is the possibility of sanity |
|
|||||
Я бы с радостью, но для получения прогресса делают loaderInfo.addEventListener(ProgressEvent.PROGRESS, handler); События там свои и вызов loaderInfo.dispatchEvent явно вызывает ошибку, это можно увидеть декомпильнув playerglobal.swc.
|
|
|||||
Modus ponens
|
Если загружаемая флешка наследуется от MovieClip - можно попробовать addFrameScript и из функции добавленой таким образом вызвать обработчик, в кототом обрабатывается "progress"... или... дописать еще одну функцию в класс перед загрузкой... или, если возможно грузить в тот же домейн, то подготовить в "своем" домейне класс с таким же названием, как и у загружаемого документ класса... но тут могут быть проблемы с линкованием к символам...
__________________
Hell is the possibility of sanity |
|
|||||
Цитата:
Есть вариант в constentPool преписать мультинейм от addEventListener на например customAddeventListener,настоящий addEventListener записать в конец со своим номером , через prototype подсунуть в loaderInfo такую функцию, внутри неё собрать обработчик прогресса и вызвать настояший addEventListener. Потом имея указатель на функцию создать progress самостоятельно и вызвать обработчик. Это решение мне не нравится т.к. оно очень геморное, и ещё тем что если у каких-то других объектов есть(а он есть) addEventListener то они все будут ходить по другому мультинейму, и всё развалится. Ещё можно просто на ходу дизассемблировать все методы, найти кто вешает ивет лисенера на прогресс на лоадеринфо, и только там подменить на свой кастомный метод, но это ну оооочень сложно, с учётом того что все джампы в байткоде относительные и вписывание своего мультинейма приведёт к изменению размеров кода и необходимости пересчитать все смещения в рамках метода. |
|
|||||
Modus ponens
|
За те же деньги можно нанять киллеров из Албании и с особым зверством убить автора подгружаемой флешки... Я это к тому что... а может легче найти автора и заставить его переделать? Пытаться застраховаться от чужих ошибок - дело долгое, неблагодарное, и все равно не получится в итоге
Добавлено через 5 минут Да, на сколько я понимаю, когда функция доходит до кноца, то стак должен быть пустым, ну, или уже все равно никому не важно, что там есть. Ну вот если реально найти того, кто подписался, то его прямо в той же функции (в конце) можно и отписать, и переподписать на что-то свое. Думаю, что если найти подписку будет возможно, то уже добавить код, который вообще никак не изменяется и не зависит от контекста будет не сложно.
__________________
Hell is the possibility of sanity |
|
|||||
Искать автора и переделывать нет смысла т.к. я сам быстро могу переделать. Нужно именно в автоматическом режиме сделать, уже много что сделал, мелочи остались типа этой.
Отписывать нет нужды т.к. всё равно не придёт. Конец функции не обязательно исполняется. После return или returnvoid исполнение прекращается, т.е. функция может выйти в середине, проверял. Потому в конце нельзя. Можно попробовать в начале подписать, там ничего не съедет, адресация вся относительная. Дальше нужный ивент сфабриковать и подсунуть не проблема. Пока решили развивать проект дальше а таких товарищей патчить ручками. Я пока только одну такую флешку видел. Хотя если у кого ещё идеи будут с удовольствием выслушаю. |
Часовой пояс GMT +4, время: 20:37. |
|
« Предыдущая тема | Следующая тема » |
Теги |
loader , loaderInfo , PROGRESS , ProgressEvent |
|
|