Пишу flash-приложение, которое должно работать минимум в девятке. В
приложении испульзуются анимация простых 3D моделей. Так как
производительность имеет большое значение, то для 9 пользуюсь
библиотекой Sandy, а для последующих версий написал с использованием
новых функций, которые нам дарит десятка.
Думаю, мне не стоит здесь рассказывать о том, как во флеше определять
версию, и соответственно включать в программу тот или иной функционал.
Проблема в другом: для десятки я пользуюсь новым типом данных
Vector.<>, и именно из-за него возникают траблы сразу при старте в
FP9.
VerifyError: Error #1033 Cpool-Entry XXX has an incorrect type.
Выглядит так, что все используемые нативные типы данных описываются
где-то экстра, и плеер это проверяет во время загрузки. Беглый взгляд
по докам к формату swf пока никакого просветления не дал. Пока-что
единственным вариантом было отказаться от использования Vector'а, но
как-то это совсем не весело.
Сразу оговорюсь, все должно находиться в --одном-- файле,
соответсвенно вариант с подзагрузкой никак не катит. Может у кого
какие Идеи?
Проблема в другом: для десятки я пользуюсь новым типом данных
Vector.<>, и именно из-за него возникают траблы сразу при старте в
FP9.
VerifyError: Error #1033 Cpool-Entry XXX has an incorrect type.
У меня похожая была задача на флексе. Я делал так:
Получить версию плеера внутри флекса можно через
flash.system.Capabilities.version (распарсить строку). Потом писал два
функционала: один с использованием 10, а другой -- без. И запихивал их
в разные классы (10 может наследоваться от 9 и перегружать функци, но
не наоборот). Потом использовал переменную без типа (var a:*) и после
проверки версии заводил экземпляр одного или другого класса.
Компилируется проект целиком под 10 флэш.
Проблемы следующие:
1. Очень трудно отлаживать, т.к. если вызвал, например, несуществующий
метод, то компиляция проходит нормально, т.к. тип не задан и имеешь
дело только с runtime error.
2. Если используется хотя бы один класс, в который был добавлен
значительный функционал в 10 плеере, которого не было в 9 (например
UIComponent и любой его наследник), то весь проект перестает работать.
Всё работало, пока я не уперся в пункт 2. Подправил проект, чтобы было
две swf-ки, каждая скомпилирована под свой плеер и подставляет нужную
уже джаваскрипт.
Сергей Крук
========================================
2009/6/2 gotoan...@googlemail.com <gotoan...@googlemail.com>:
On Jun 2, 11:56 am, Sergey Kruk <sergey.k...@gmail.com> wrote:
> У меня похожая была задача на флексе. Я делал так:
Благодарю Вас, Сергей, но пока что вы подробнее рассписали мою фразу:
"Думаю, мне не стоит здесь рассказывать о том, как во флеше
определять
версию, и соответственно включать в программу тот или иной
функционал."
Поймите, проблема именно (и только) в новом top-level классе Vector.
а разве я написал, что меня это не устраивает???
еще раз: если --- где-либо --- в программе проскакивает Vector,
независимо от того, выполняется этот код или нет => error.
Я понимаю, мы все тут профессионалы, не стоит об очевидных вещах. Но
ActionScript это же не интерпретатор. :)
Стоит ли упоминать, что в ActionScript нужно не только чтобы код не
выполнялся, но даже не заводился объект класса, в котором есть код,
который не подходит к плееру? Даже чтобы не объявлялась переменная
этого типа?
var a:*;
if getMagicVersion() >= 10 {
a = new BrandNewUsingVector();
} else {
a = new OldSchoolNoVectorNever();
}
Стоит ли говорить, что в определении класса OldSchoolNoVectorNever не
должно быть никаких новых классов. Как и в описании его предков?
Сергей Крук
=========================================
2009/6/2 gotoandscript <gotoan...@googlemail.com>:
- если вы можете полностью реализовать приложение на 9-м плеере, то
зачем вам еще и 10-я версия?
Это мазохизм какой-то.
Класс Vector сделан для того, чтобы облегчить программирование. Но,
если вы уже реализовали или обязательно должны реализовать требуемый
функционал под 9-й плеер, то какой смысл туда докидывать варианты
10-го?
Прекратите ерундой заниматься.
В принципе, одна SWF может содержать и несколько скриптов (правда, как
это сделать стандартными средствами, я не знаю), у каждого из которых
свой Cpool. Однако, боюсь, верификатор всё равно будет проверять их
все, так что такой способ может и не помочь.
Однако могу предложить такой вариант. Очень геморройный, но если стоит
задача умесчтить всё именно в одну SWF, то похоже это единственный
способ.
1. Всё, что касается FP10 и использует Vector сперва компилируется в
отдельную SWF.
2. Полученная SWF в виде ByteArray ембедиться в основную SWF.
3. При необходимости загружается с помощью URLLoader.loadBytes().
>, а юзера попросите обновится яваскриптом или просто текстом
в том-то и дело, что юзер "очень вредный", т.к. корпоративный, где на
новые технологии переходят года так через два, а Админ считает себя
первой шишкой после директора. К тому же flash выполняется не в
браузере, а embed.
> По моему одной флешкой реализовать это не возможно...
просто надеюсь по схеме:
"на каждую хитрую ж..."
3. При необходимости загружается с помощью URLLoader.loadBytes().
спасибо за конструктивный ответ. Может Вам известно где найти подробую
тех-информацию, или я пропустил это в доках к swf-формату?
> Однако могу предложить такой вариант. Очень геморройный...
это точно! :) но, в принципе, действительно реальный (как-то совсем не
вспомнил про это). Буду мозговать по поводу.
1. скомпилять SWF, который содержит только то, что надо и не содержит
ничего лишнего (как бы плагин).
2. заембедить его в виде ByteArray.
http://www.adobe.com/devnet/actionscript/articles/avm2overview.pdf
(правда уже старый документик)
Про Cpool рассказывается в главах 4.3 и 4.4