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

Вернуться   Форум Flasher.ru > Блоги > e4xu

Всякие разные штуки сомнительной полезности сделанные в свободное от работы время.
Оценить эту запись

HaXe двукадровый SWF (Темплейт с прелоадером).

Запись от wvxvw размещена 04.02.2010 в 15:52
Обновил(-а) wvxvw 05.02.2010 в 03:58

На поиск решения этой проблемы ушло несколько недель. Врезультате были обнаружены баги, несовместимости и другие подводные камни.
Итог: проблема решена, но решение оставляет желать много лучшего.
Итак, описание проблемы: как оказалось, в SWF скомпилированой с помощью HaXe очень многое зависит от инициализации flash.Boot класса. Этот класс - по сути точка входа, но кроме всего прочего он еще и инициализирует другие базовые классы, например Xml. HaXe компилятор всегда создает flash.Boot символ с одним и тем же именем, изза чего, если мы попытаемся просто совместить 2 SWF скомпилированые в HaXe, то ничего не получится, т.как классы из второго кадра будут искать второй flash.Boot, а в текущем АpplicationDomain такой класс будет всего один, и это будет flash.Boot первого кадра. Даже если мы этот символ найдем и переименуем в уже скомпилированой SWF, все равно работать не будет т.как некоторые классы обращаются к нему через reflection - и, естесственно, они переименованый класс в таком случае не найдут.
Таким образом, единственное рабочее решение - встроить весь второй кадр как один бинарный тег и загрузить его байты в новый АpplicationDomain.
Недостатки такого подхода очевидны: все декларации классов существующие в первом кадре мопгут быть продублированы во втором - таким образом есть шанс получить "лишние" классы. Кроме того, это затрудняет передачу каких либо параметров из кадра-прелоадера во второй кадр. Еще один недостаток - просмотреть такую SWF с помощью рефлектора нельзя т.как все, что находится во втором кадре окажется просто одним большим бинарным куском.

Но, если ничего из выше перечисленного вас не смутило, то, конечно, вы можете попробовать этот шаблон для FlashDevelop:
http://e4xu.googlecode.com/files/380-template.zip
Как установить шаблон:
  • распаковать в папку <куда инсталировали FlashDevelop>/Projects
  • перезапустить FlashDevelop.
  • Теперь в меню Project > New Project у вас появится HaXe AS3 Project with Preloader

Что есть в шаблоне:
  • build.hxml
    С помощью этого файла собирается наш проект.
  • frame-1.xml
    Файл настроек компиляции для первого кадра необходимый для HXswfML (об этом пожже)
  • frame-2.xml
    Файл настроек компиляции для второго кадра необходимый для HXswfML (об этом пожже)

Чего нет в шаблоне:
  • HXswfML.ехе
    это утилита позволяющая комбинировать и даже создавать и линковать части SWF, собственно, если вы знакомы с SWFMill или SamHaXe - это одного поля ягода.
    Где ее взять:
    http://code.google.com/p/hxswfml/
    Тут есть и исходники и бинарники, я использовал C++ бинарник (пробовал и тот, что выложен для скачивания и сам компилировал, оба работают).
    Можно так же использовать neko бинарники (автор утилиты восновном использует именно их).
Почему именно HXswfML а не SamHaXe:
Я чесно умаялся настраивать и компилировать SamHaXe... не то, чтобы это было гипер сложно, но все-таки HXswfML проще. SamHaXe позволяет линковать больше видов ресурсов, но HXswfML позволяет делать больше манипуляций с байткодом, флешевыми тегами и у него есть даже несколько интересных заготовок более высокого уровня, например <Tween> тег позволяющий анимировать шейпы помещенные на таймлайн без участия кода (т.е. как во Flash IDE).

На днях я постараюсь выложить альтернативный темплейт с использованием SamHaxe, и если дойдут руки - SWFMill.
А пока - пробуйте

Вот, как и обещал, добавлен шаблон с использованием SamHaxe
http://e4xu.googlecode.com/files/390-template.zip
Я еще пытаюсь разобраться в некоторых особенносях, которые на первый взгляд выглядят как баги:[list][*]SamHaxe почему-то записывает очень низкий FPS (поэтому в темплейте он выставляется вручную).[*]Выдает загадочное предупреждение о попытке переназначить flash.Boot символ (но тем не менее все работает).[*]Один из аттрибутов в XMLе настроек имеет какой-то сакральный смысл, тайну которого мне разгадать не удалось (речь о genclass). Не важно какие бы ни были настройки результат получается тот же самый.[list]
Размещено в HaXe
Комментарии 2 Отправить другу ссылку на эту запись
Всего комментариев 2

Комментарии

Старый 06.02.2010 01:07 Alex Lexcuk вне форума
Alex Lexcuk
а я победил flash.boot в прелоадере haxe, он состоит из двух флешек, с одинаковой структурой классов и все таки они дублируются, но во флешке, которая компилится во второй кадр надо найти flash.boot и заменить его на любую фигню, ну к примеру flash.b123, я менял на flash.HaXe и прелоадер будет работать
свои мысли по этому поводу выложил в
http://www.murmadillo.tut.su/as3/fri...piler-as3.html
Это получился такой себе кодо-ресурсо пряталка, я подумал, а не въембедить ли мне нормальную флешку (флеш иде или флекс) во второй кадр хахе прелоадера, ведь ни один декомпилятор ее потом не достанет, и очень обрадовался, когда все получилось так легко.
Однако ложкой дегтя в бочке с медом, оказалось, что на виндоус машинах, некоторые (незнаю какие антивирусы, у меня касперски со всеми обновлениями - нифига) засвечивают haxe флешку, созданную таким образом как вирус, это меня угнетает ибо все ж знают и понимают, что вирусы во флешках - утопия и с реальностью не имеет ничего общего, тк. сам плеер как вирт. машина безвредный для компьютера пользователя, тк. не имеет к нему доступа физически.
Вот темка, я ничего не придумал...
http://www.free-lance.ru/blogs/view....511483&ord=new
Старый 06.02.2010 02:10 wvxvw вне форума
wvxvw
 
Аватар для wvxvw
Я пробовал переименовывать. Что-то этим лечится, а что-то нет. Xml класс особо на этом фоне отличился - не инициализируются его статические свойства. Нашел какие-то древние упоминания о том, что была такая проблема, но ничего толкового по этому поводу так и не нашел. Т.е. кто-то советовал Xml.__init__() вызывать - я попробовал, не сработало а даже если бы и сработало, то - а зачем оно нужно основывать на хаках темплейт - ну ладно, в прелоадере будет 5-6 классов которые повторятся в основной флешке... ну потеряли 4-5 килобайт на этом, в конце концов - не смертельно.

EDIT:
Кроме того: смотри, есть классы которые к символу flash.Boot стучатся через рефлекшн - искать по всему коду строки похожие на "Boot" и менять их?
А по поводу антивируса - я бы попробовал вот что: может быть если не сжимать ByteArray или наоборот, если его сжать - может он успокоится? Все равно вся флешка потом сжимается, так что не принципиально будет ли ресурс зазипован отдельно или нет.
Обновил(-а) wvxvw 06.02.2010 в 02:15
 

 


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


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