Просмотр полной версии : Загрузчик "Все сразу"
Привет всем.
В моей флешке используются много одинаковых внешних swf-ок. Хочется загрузить одну за один раз, а потом просто брать дубликаты. Полагаться на то, что одинаковые swf-ки кэшируются я не могу (надо брать загруженный дубликат моментально, а не через, например, 0,1с, как при кэшировании) и не хочу.
Идея такая:
Создаю класс ExternalFilesLoader, в котором Loader загружает одну swf-ку в себя. Далее нужна функция, которая бы копировала эту swf-ку и возвращала ее (например, как Loader, не важно). Далее я хочу вызывать эту функцию хоть 100 раз и что бы все подружалось моментально. Тут и есть проблема.
...
url = new URLRequest("blah-blah.swf");
_sampleLoader= new Loader();
_sampleLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoadComplete);
_sampleLoader.load(url);
...
public function getCopy():Loader {
var targetClass:Class = _sampleLoader["constructor"];
var duplicate:Loader = new targetClass();
...
Этот код создает пустой экземпляр Loader. Как вернуть просто копию?
Вообще, моя затея с моментальным возвращением дубликата внешнего файла swf верна?
> Вообще, моя затея с моментальным возвращением дубликата внешнего файла swf верна?
Конечно нет.
Зачем подгружать одно и тоже несколько раз.
Подгружаете swf один раз, затем создаете сколько угодно экземпляров включенных в нее данных.
Если конечно они отлинкованы а не просто лежат в главной timeline.
Подождите, может Вы меня не так поняли.
Я и хочу загрузить swf-ку только один раз, т.е. я даже хочу загрузить все внешние swf-ки, используемые в главной флешке один раз, а потом просто брать дубликаты без всяких подгрузок.
Вот и все. И никакой главной таймлайн я не использую (пишу даже не в Flash IDE).
Ну так и загружайте один раз.
А что у Вас в этих swf?
> пишу даже не в Flash IDE
А в чем?
Ну так и загружайте один раз.
А что у Вас в этих swf?
У меня флешка, у нее должна быть поддержка скинов, элементы которых я решил брать из внешних swf-ок. Там содержатся элементы интерфейса, можно так сказать 8).
А в чем?
В FDT 3.
Ну так и загружайте один раз.
Дак я и так гружу один раз!
Но как мне потом сделать штук 40 копий этого файла? Если я буду делать addChild, например, то у меня они не будут дублироваться.
> Дак я и так гружу один раз!
Но как мне потом сделать штук 40 копий этого файла? Если я буду делать addChild, например, то у меня они не будут дублироваться.
Конечно не будут. Нужно создавать новый экземпляр.
А внешние swf тоже в FDT собирались?
Нужно создавать новый экземпляр.
А внешние swf тоже в FDT собирались?
Я и создаю новый экземпляр Loader, тока они естественно пустыми получаются. Внешние swf компилятся в Flash IDE, как предполагается, дизайнерами. А это имеет значение, чем компилятся внешние swf? Мы можем ровно с тем же успехом полагать, что грузим jpg вместо swf.
Если бы Вы грузили jpg, то можно было использовать один и тот же BitmapData. И на основе него создавать сколько угодно Bitmap.
А в Вашем случае наилучший вариант это запихнуть все данные в одну swf, прописать им классы и пользоваться.
т.е. предлагаете [Embeded]?
Я сначала так и делал, но так не пойдет, не все смогут юзать это.
Или как Вы предлагаете?
Тут 2 варианта:
1) Загружать все файлы отдельно, в них прописать Document class.
Затем через applicationDomain получить доступ к Document class и создавать нужное число экземпляров.
2) Все swf запихнуть в библиотеку одного файла, прописать им Linkage. Загрузить этот файл swf. Далее то же самое.
Все это конечно актуально если у Вас есть доступ к исходникам :)
Хм... Думаю, стоит пошаманить в области
var _sampleLoader:Loader = new Loader();
_sampleLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoadComplete);
_sampleLoader.load(new URLRequest("blah-blah.swf"));
function onLoadComplete(event:Event):void
{
event.target.content;
}
Я пишу компонент с поддержкой скинов.
Идеально конечно если скин будет являться одним swf-файлом, например, defaultSkin.swf, а в нем будут символы (элементы скина), в которых прописаны заранее декларированные Linkage Class.
Я хочу сделать типа прелоадера, в котором до загрузки всей флешки будет загружаться этот скин swf. Из него я и буду уже множить мои элементы.
Попробуйте new loader.content['constructor']. Только сомневаюсь, что будет работать.
Ну вот, пункт 2.
Плиз, можно более подробно? Я думаю понятно теперь что я хочу... :victory:
P.S. Народ, как вообще делается скинирование в компонентах? Может есть какие-нибудь наработки или готовые решения?
Хм... А чем вам не нравится вариант с png скинами + ScaleBitmap (с поддержкой 9scalegrid)?
Ну, скажем, как это сделано у http://www.bytearray.org/?p=109.
Пример: http://www.foxaweb.com/projects/liquid/demo/demoLiveSkinning.html
Пример скина: http://www.foxaweb.com/projects/liquid/demo/skin/Button_skin.png
Я, на пример, давно взял png скины на вооружение. И не нужны никакие linkage + универсальнее метод.
Попробуйте new loader.content['constructor']. Только сомневаюсь, что будет работать.
Денис, ты телепат :)
у меня кроме шкурки должен быть функционал небольшой, например, создаем символ-кнопку, у класса этого символа должна быть функция setText(), которая устанавливает текст на кнопке, а как это будет обрабатываться внутри моей флешке уже все равно. Т.е. у некоторых элементов будет взаимодействие через мини API.
Попробуйте new loader.content['constructor']. Только сомневаюсь, что будет работать.
пипец, работает... :drinks: :drinks: :drinks:
спасибо всем!
Ну, а в чем проблема-то?
Вам нужно-то всего навсего сделать класс Skin, который будет парсить bitmapdatу pngшки и scalebitmap. В итоге в каждом вашем интерфейсе будет что-то типа:
var skin:Skin = new Skin();
var bg:ScaleBitmap = new ScaleBitmap();
skin.addEventListener(Event.COMPLETE, skinLoaded);
skin.load(new URLRequest("skin.png"));
function skinLoaded(event:Event):void
{
bg.bitmapdata = skin.bitmapdata;
bg.scale9grid = skin.scale9grid;
addChild(bg);
}
new loader.content['constructor']
А как мне можно достучаться до Linkage Class таким способом? Что-то не получается... Т.е. у меня в библиотеке есть символ с Linkage Class, и мне хочется создать экземпляр именно этого символа.
Спасибо заранее..
var c:Class = loader.contentLoaderInfo.applicationDomain.getDefinition("ClassName") as Class;
var obj:Sprite = new c();
var c:Class = loader.contentLoaderInfo.applicationDomain.getDefinition("ClassName") as Class;
var obj:Sprite = new c();
Мега круто! Спасибо!!
Чувствую выльется все это у меня в SkinManager на основе swf-файлов.
Но и внедрение PNG нужно попробовать...
Хм... Ну, если исходить из эстетической точки зрения, то, если вам важно именно веторные скины, используйте.
Но это не практично. Объясню. В свое время (когда я писал Skin, SkinManager) то понял, что наши дизайнеры не знают linkage :) (что не удивительно), зато они знают Export as: *.png (32) в фотошопе. А когда я прихожу на работу и у меня лежат 50 Fla и в каждом по 30 скинов = 30*50 = 1500 и каждому надо linkage задать, то я понял, что лучше PNG скины. И им проще и мне проще, а на визуальную часть никак "глазом" не влияет.
Фишка вся в png в том, что любой может потом скинить и flash-разработчик и дизайнер. Поэтому от swf я отказался. Так что... Есть над чем подумать
Ты прав,
мне вектор особо ни к чему, но я вижу и другие плюсы swf - скомпиленная сборка, при желании ее не вскроешь и/или не изменишь, т.е. любой может распространять скин. В png есть, конечно, свои плюсы.
А ты юзаешь этот LiquidComponent? Он фри?
Decompiler кто-то отменял? ;)
enepx не надо паранои. На все есть принт-скрин + ф-ия trace в Corel X3 (отлично битмапки трейсит). И на swf и на png. Так что... Цена вопроса..
А ты юзаешь этот LiquidComponent? Он фри?
Конечно. Жаль, во Flex/Flash не такие компоненты. Я их доделал для себя и использую, когда нужно. Ну, он же опен-сурсный. Скачай исходники и балуйся :)
У класса Loader начиная с версии плеера 115 существует свойство .bytes. После загрузки чего бы то ни было можно это свойство заполучить и записать в ByteArray, чем оно и является. Таким образом вы сможете насоздавать сколько угодно копий загруженного контента просто с помощью ByteArray.writeBytes()
Даже проще =)
У Loader'a помимо метода load(URLRequest), есть метод loadBytes(byteArray).
Загружаем внешний файл как массив байтов, и лоадером считываем этот массив неограниченное число раз внутри программы.
*метод, loadBytes - тоже асинхронный, поэтому рекомендую обращаться к событию окончания загрузки.
public var urlLoader:URLLoader = new URLLoader();
public function LoaderTest()
{
urlLoader.dataFormat = URLLoaderDataFormat.BINARY;
urlLoader.load(new URLRequest('image.png'));
urlLoader.addEventListener(Event.COMPLETE, bytesLoaded);
}
public function bytesLoaded(e:Event):void
{
var byteArray:ByteArray = ByteArray(urlLoader.data);
var loader1 = new Loader();
loader1.loadBytes(byteArray);
addChild(loader1);
var loader2 = new Loader();
loader2.loadBytes(byteArray);
addChild(loader2);
loader2.x = loader2.y = 20
}
В случае с SWF-кой не очень удобно, т.как она загрузится заархивированая (т.е потом на каждое прочтение ее нужно будет опять разархивировать), а .byes это уже разархивированая флешка. Ну, хотя, тоже, зависит, что критичнее.
Но ведь так будет расходоваться в n раз больше памяти.
BlooDHounD
14.08.2008, 11:53
в обоих случаях памяти будет знатно жраться :)
Ну я оба случая и имел в виду :)
Если создать n отлинкованных экземпляров объекта и n копий с помощью loadBytes, разница в расходе памяти и будет в n раз.
Decompiler кто-то отменял? ;)
enepx не надо паранои. На все есть принт-скрин + ф-ия trace в Corel X3 (отлично битмапки трейсит). И на swf и на png. Так что... Цена вопроса..
Решил использовать swf, как контейнер не только для хранения графики, но и для звука, кода (каждый пользователь сам определяет как будет себя вести его скин, например, при вызове у него функции setCaption) и т.д. Так что убодно имхо. :away:
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.